排序之插入排序
来源:互联网 发布:淘宝海外入驻入口 编辑:程序博客网 时间:2024/06/16 06:23
基本思想:每次将一个待排序的记录,按其关键字大小插入到前边已经排好序的子数组中的适当位置,知道全部记录插入完成为止。
分类:直接插入排序和希尔(shell)排序。
一、直接插入排序:
基本操作:将当前无序区的第一个记录R[i]插入到有序区R[1....i-1]中适当的位置,使得R[1...i]变为新的有序区。每次使有序区增加1个记录,也称为增量法。
可分解为以下步骤:
(1)在当前有序区R[1...i-1]中查找R[i]的正确插入位置k;
(2)将R[1...i-1]中的记录均后移以为i,腾出k位置上的空间插入R[i]。
对以上的方法进行改进,使得查找比较和记录移动操作交替进行。将待插入的记录R[i]的关键字从右向左依次与有序区中记录R[j](j=i-1,...,1’)的关键字进行比较。
采用升序排序:(1)如果R[j]的关键字大于R[i]的关键字,则将R[j]后移一位;
(2)如果R[j]的关键字小于或等于R[i]的关键字,则查找过程结束,(j+1)即为R[i]的插入位置。
这样便可完成一次直接插入排序。
使用改进方法的程序如下:
void insert_sort(int a[],int len){for(int i=1;i<len;i++){int temp=a[i];for(int j=i-1;j>=0 && a[j]>temp;j--)a[j+1]=a[j];a[j+1]=temp;}}
基本思路:在直接插入排序中,每次只插入一个数,使有序序列只增加1个节点,并且对插入的下一个数没有提供任何帮助。希尔排序先将要排序的一组数按照某个增量d分成若干组,对每个组中的元素进行排序,然后用一个较小的增量对它进行再次分组,并对新组进行再排序。当增量减到1时,整个要排序的数被分成一个组,排序完成。所以,希尔排序其实质上也是一种分组插入的方法。
代码如下:
void shell_sort(int a[],int len){int temp;for(int h=len/2;h>0;h/=2)//控制增量{for(int i=h;i<len;i++){temp=a[i];for(int j=i-h;j>=0&&a[j]<temp;j-=h){a[j+h]=a[j];}a[j+h]=temp;}}}
三、直接插入排序是一种稳定的排序方法;希尔排序是不稳定的排序方法。
希尔排序的时间性能优于直接插入排序,其原因如下:
1、当数组初始状态基本有序时,直接插入排序所需的比较和移动次数均较少。
2、当n值较小时,n和n2的差别也较小,即直接插入排序的最优时间复杂度O(n)和最坏时间复杂度O(n2)差别也不大。
3、在希尔排序开始时增量较大,分组较多,每组的记录数目少,在各组内直接插入较快,随着增量d减小,分组数逐渐减小,而各组的记录数目逐渐增多,但此时数组已较接近有序状态,所以最后一次排序也较快。
阅读全文
0 0
- 排序之插入排序
- 排序之插入排序
- 排序之插入排序
- 排序之插入排序
- 排序之插入排序
- 排序之插入排序
- 排序之插入排序
- 排序之插入排序
- 排序之插入排序
- 排序之插入排序
- 排序之插入排序
- 排序之插入排序
- 排序之插入排序
- 排序之插入排序
- 排序之插入排序
- 排序之插入排序
- 排序之插入排序
- 排序之插入排序
- PCIISA桥设计和实现
- 计算机网络的结构
- make makefile cmake qmake
- ZOJ1516_Uncle Tom's Inherited Land_二分图(匈牙利算法)
- 元组UPLE:戴上了枷锁的列表--2017/9/3--1
- 排序之插入排序
- LeetCode 326. Power of Three
- c面试考点
- kuangbin 数论 A题
- Windows bat脚本获取administrator权限
- struts2的核心和工作原理
- Unity入门学习 //05_Inspector窗口
- front()的作用
- 002-支持并发的内部类饿汉单例