数据结构排序法之插入法
插入排序是一种简单直观的排序算法。它的工作原理非常类似于我们抓扑克牌。
对于未排序数据(右手抓到的牌),在已排序序列(左手已经排好序的手牌)中从后向前扫描,找到相应位置并插入。
插入排序在实现上,通常采用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; // 插入元素 }
}
数据结构排序法之插入法相关推荐
- 数据结构排序法之希尔排序法(Shell Sort)
希尔排序,也叫递减增量排序,是插入排序的一种更高效的改进版本.希尔排序是不稳定的排序算法. 希尔排序是基于插入排序的以下两点性质而提出改进方法的: 1.插入排序在对几乎已经排好序的数据操作时,效率高, ...
- 二分排序法(折半插入法)
二分排序法貌似是第一次听说,在wangsifu2009的博客上看到. 以前只听说过堆排序.快排序.希尔排序.选择.插入.冒泡排序,于是在网上搜索了一下,其代码实现是这样的: #include < ...
- 数据结构排序法之堆排序he归并排序
堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法.堆是一个近似完全二叉树的结构,并同时满足堆性质:即子结点的键值或索引总是小于(或者大于)它的父节点. 堆排序的时间,主要由建立初始 ...
- 数据结构排序法之鸡尾酒排序法he快速排序法
鸡尾酒排序,也叫定向冒泡排序,是冒泡排序的一种改进.此算法与冒泡排序的不同处在于从低到高然后从高到低,而冒泡排序则仅从低到高去比较序列里的每个元素.他可以得到比冒泡排序稍微好一点的效能. // 两两互 ...
- 数据结构 - 简单选择排序法
数据结构 - 简单选择排序法 在之前的博文里已经介绍过排序的两个基本方法: 双重循环法和冒泡排序法. 基本思想 其实上面两种方法的基本思想都是一样的: 就是将排序步骤分成两层循环, 在内层的每1个循环 ...
- LeetCode--88.合并两个有序数组(插入法,排序法)
合并两个有序数组(C, Python) 1. 题目描述 2. 题目分析 3. C语言实现 4. Python语言实现 1. 题目描述 难度:简单 2. 题目分析 这道题比较简单,实现方法有两种: 插入 ...
- C语言中数组的排序算法详解——选择法、冒泡法、交换法、插入法、折半法
选择法排序 选择法排序是指:如果要把一个数组从小到大排列,那么就从该数组中依次选择最小的数字来排序.从第一个数字开始,将第一个数字与数组中剩下数字中最小的那一个交换位置,然后将第二个数字与剩下数字中最 ...
- c语言排序算法插入法,C语言中冒泡法、选择法、插入法三种常见排序算法分析.doc...
C语言中冒泡法.选择法.插入法三种常见排序算法分析.doc 一.冒泡法(起泡法) 算法要求用起泡法对10个整数按升序排序. 算法分析如果有n个数,则要进行n-1趟比较.在第1趟比较中要进行n-1次相邻 ...
- 【数组的排序方法】 选择法、冒泡法、交换法、插入法、折半法
目录 前言 一.选择法排序 二.冒泡法排序 三.交换法排序 四.插入法排序 五.折半法排序 前言 我们前面已经了解过数组的理论知识,但虽说数组是一个有序的集合,但这里的顺序指的是数组元素所在数组中的位 ...
最新文章
- knn 进行手写数字识别
- 事务处理不当,线上接口又双叒内存泄漏了!(附图解问题全过程)
- Thread Per Message Pattern
- JavaScript正则表达式详解(一)正则表达式入门
- 查看 PHP apache nginx mysql 是如何编译的
- matlab求矩阵中值函数,matlab在一个函数里,如何调用另一个函数里面求得的雅可比矩阵并赋值?...
- php3绕过,PHPB2B注入#3(绕过过滤)
- 分区丢失导致文件丢失?巧用EasyreCovery找回
- 如何使用EasyRecovery进行深度扫描和继续扫描
- (转)wxWindows一些网文
- 饭店点餐系统之模块划分
- linux安全-用户行为监控
- freeradius在AP控制器设备中test-aaa 显示timeout的解决方案
- 《圣经》中最让人感动的十句话(转)
- 怎么用命令改变legend在图中的位置
- 动手实现一个docker引擎-1-从内核到docker的三驾马车
- 刚子扯谈:广告向东 客户向西
- linux与hadoop常用命令梳理
- 用超级终端强化你的手机---AT Command 命令控制手机
- (三) 技术选型 1.项目框架模式:MVP(得分点);注意:分包分层,避免内存泄漏; 2.图片加载:Fresco图片加载框架; 3.网络加载框架:retrofit;使用Retrofit+RxJ