插入排序是一种简单直观的排序算法。它的工作原理非常类似于我们抓扑克牌。

对于未排序数据(右手抓到的牌),在已排序序列(左手已经排好序的手牌)中从后向前扫描,找到相应位置并插入。

插入排序在实现上,通常采用in-place排序(即只需用到O(1)的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。
具体算法描述如下:

1、从第一个元素开始,该元素可以认为已经被排序
2、取出下一个元素,在已经排序的元素序列中从后向前扫描
3、如果该元素(已排序)大于新元素,将该元素移到下一位置
4、重复步骤3,直到找到已排序的元素小于或者等于新元素的位置
5、将新元素插入到该位置后
重复步骤2~5
代码如下:

// 插入排序法
void Insert (int* a, int len)
{int i, j, get;// 从数组第二个开始向后遍历,和他之前的比较并找到插入的位置for (i = 1; i < len; i++){get = a[i];                     // 保存要插入的数j = i-1;                        // 比较对象从他前一位开始// 找到比他小的,并且进行移位while (j >= 0 && a[j] > get){a[j+1] = a[j];j--;}a[j+1] = get;                   // 插入元素}
}

对于插入排序,如果比较操作的代价比交换操作大的话,可以采用二分查找法来减少比较操作的次数,我们称为二分插入排序。
代码:

// 二分插入排序法
void Half_Insert (int* a, int len)
{int i;  // 从数组第二个开始向后遍历,和他之前的比较并找到插入的位置for (i = 1; i < len; i++){int left  = 0;int right = i - 1;int get   = a[i];// 缩小范围,直到找到插入的位置while (left <= right){int mid = (right+left) / 2;if (a[mid] > get){right = mid - 1;}else{left = mid + 1;}       }// 移位int j;for (j = i-1; j >= left; j--){a[j+1] = a[j];}a[left] = get;                      // 插入元素 }
}

数据结构排序法之插入法相关推荐

  1. 数据结构排序法之希尔排序法(Shell Sort)

    希尔排序,也叫递减增量排序,是插入排序的一种更高效的改进版本.希尔排序是不稳定的排序算法. 希尔排序是基于插入排序的以下两点性质而提出改进方法的: 1.插入排序在对几乎已经排好序的数据操作时,效率高, ...

  2. 二分排序法(折半插入法)

    二分排序法貌似是第一次听说,在wangsifu2009的博客上看到. 以前只听说过堆排序.快排序.希尔排序.选择.插入.冒泡排序,于是在网上搜索了一下,其代码实现是这样的: #include < ...

  3. 数据结构排序法之堆排序he归并排序

    堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法.堆是一个近似完全二叉树的结构,并同时满足堆性质:即子结点的键值或索引总是小于(或者大于)它的父节点. 堆排序的时间,主要由建立初始 ...

  4. 数据结构排序法之鸡尾酒排序法he快速排序法

    鸡尾酒排序,也叫定向冒泡排序,是冒泡排序的一种改进.此算法与冒泡排序的不同处在于从低到高然后从高到低,而冒泡排序则仅从低到高去比较序列里的每个元素.他可以得到比冒泡排序稍微好一点的效能. // 两两互 ...

  5. 数据结构 - 简单选择排序法

    数据结构 - 简单选择排序法 在之前的博文里已经介绍过排序的两个基本方法: 双重循环法和冒泡排序法. 基本思想 其实上面两种方法的基本思想都是一样的: 就是将排序步骤分成两层循环, 在内层的每1个循环 ...

  6. LeetCode--88.合并两个有序数组(插入法,排序法)

    合并两个有序数组(C, Python) 1. 题目描述 2. 题目分析 3. C语言实现 4. Python语言实现 1. 题目描述 难度:简单 2. 题目分析 这道题比较简单,实现方法有两种: 插入 ...

  7. C语言中数组的排序算法详解——选择法、冒泡法、交换法、插入法、折半法

    选择法排序 选择法排序是指:如果要把一个数组从小到大排列,那么就从该数组中依次选择最小的数字来排序.从第一个数字开始,将第一个数字与数组中剩下数字中最小的那一个交换位置,然后将第二个数字与剩下数字中最 ...

  8. c语言排序算法插入法,C语言中冒泡法、选择法、插入法三种常见排序算法分析.doc...

    C语言中冒泡法.选择法.插入法三种常见排序算法分析.doc 一.冒泡法(起泡法) 算法要求用起泡法对10个整数按升序排序. 算法分析如果有n个数,则要进行n-1趟比较.在第1趟比较中要进行n-1次相邻 ...

  9. 【数组的排序方法】 选择法、冒泡法、交换法、插入法、折半法

    目录 前言 一.选择法排序 二.冒泡法排序 三.交换法排序 四.插入法排序 五.折半法排序 前言 我们前面已经了解过数组的理论知识,但虽说数组是一个有序的集合,但这里的顺序指的是数组元素所在数组中的位 ...

最新文章

  1. knn 进行手写数字识别
  2. 事务处理不当,线上接口又双叒内存泄漏了!(附图解问题全过程)
  3. Thread Per Message Pattern
  4. JavaScript正则表达式详解(一)正则表达式入门
  5. 查看 PHP apache nginx mysql 是如何编译的
  6. matlab求矩阵中值函数,matlab在一个函数里,如何调用另一个函数里面求得的雅可比矩阵并赋值?...
  7. php3绕过,PHPB2B注入#3(绕过过滤)
  8. 分区丢失导致文件丢失?巧用EasyreCovery找回
  9. 如何使用EasyRecovery进行深度扫描和继续扫描
  10. (转)wxWindows一些网文
  11. 饭店点餐系统之模块划分
  12. linux安全-用户行为监控
  13. freeradius在AP控制器设备中test-aaa 显示timeout的解决方案
  14. 《圣经》中最让人感动的十句话(转)
  15. 怎么用命令改变legend在图中的位置
  16. 动手实现一个docker引擎-1-从内核到docker的三驾马车
  17. 刚子扯谈:广告向东 客户向西
  18. linux与hadoop常用命令梳理
  19. 用超级终端强化你的手机---AT Command 命令控制手机
  20. (三) 技术选型 1.项目框架模式:MVP(得分点);注意:分包分层,避免内存泄漏; 2.图片加载:Fresco图片加载框架; 3.网络加载框架:retrofit;使用Retrofit+RxJ

热门文章

  1. list.size为1但是内容为null
  2. TreeMap实现对中文的排序
  3. python慢为什么用的人还很多_为什么是所有人比python标准慢得多吗?
  4. linux心跳包检测代码_OpenSSL心跳包越界读敏感信息泄漏漏洞
  5. 推荐系统(3)-协同过滤2-矩阵分解算法
  6. 65种GPU性能测试,AMD开源驱动领先!
  7. OpenCL memory object 之 Global memory (1)
  8. 零负债之人的10个习惯
  9. linux 32位平台,文件大小受限于2G的解决方法
  10. FPGA数据传输模块设计