常见的排序算法(一) 插入排序
2016-05-26 13:09
260 查看
插入排序分为:直接插入排序,二分插入排序(又称折半插入排序),链表插入排序,希尔排序(又称缩小增量排序)。属于稳定排序的一种(通俗地讲,就是两个相等的数不会交换位置) 。
在这里我具体讲直接插入排序和希尔排序。直接排序插入直接插入排序是由两层嵌套循环组成的。外层循环标识并决定待比较的数值。内层循环为待比较数值确定其最终位置。直接插入排序是将待比较的数值与它的前一个数值进行比较,所以外层循环是从第二个数值开始的。当前一数值比待比较数值大的情况下继续循环比较,直到找到比待比较数值小的并将待比较数值置入其后一位置,结束该次循环。
基本思想 待排序记录 R1,R2,… ,Rn–1, Rn 第一步:R1 第二步:(R1 ), R2 第三步:(R1 , R2), R3 …… 第 j 步:(R1,R2,… ,Rj–1), Rj …… 第 n 步: (R1,R2,… ,Rn–1), Rn.
正如以上图片所示,直接排序总是先使前面一段有序,然后依次往后,知道整个数组都有序。
希尔排序希尔排序(Shell Sort)是插入排序的一种。也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法。该方法因DL.Shell于1959年提出而得名。希尔排序是按照不同步长对元素进行插入排序,当刚开始元素很无序的时候,步长最大,所以插入排序的元素个数很少,速度很快;当元素基本有序了,步长很小,插入排序对于有序的序列效率很高。所以,希尔排序的时间复杂度会比o(n^2)好一些。正如下图650) this.width=650;" src="http://s1.51cto.com/wyfs02/M02/80/6D/wKiom1dBOjuTu0BWAAAxcKyEX04636.png" title="5.png" alt="wKiom1dBOjuTu0BWAAAxcKyEX04636.png" />此处,我的步长是以3为例,由上便可以看出,步长包括了整个数组。第一个是:2,9,8,1 --》1,2,8,9第二个是:5,3,7 ——》 3,5,7第三步是:4,6,1 -》 1,4,6代码如下
在这里我具体讲直接插入排序和希尔排序。直接排序插入直接插入排序是由两层嵌套循环组成的。外层循环标识并决定待比较的数值。内层循环为待比较数值确定其最终位置。直接插入排序是将待比较的数值与它的前一个数值进行比较,所以外层循环是从第二个数值开始的。当前一数值比待比较数值大的情况下继续循环比较,直到找到比待比较数值小的并将待比较数值置入其后一位置,结束该次循环。
基本思想 待排序记录 R1,R2,… ,Rn–1, Rn 第一步:R1 第二步:(R1 ), R2 第三步:(R1 , R2), R3 …… 第 j 步:(R1,R2,… ,Rj–1), Rj …… 第 n 步: (R1,R2,… ,Rn–1), Rn.
正如以上图片所示,直接排序总是先使前面一段有序,然后依次往后,知道整个数组都有序。
void InserSort(int * a,size_t size) //直接插入排序 { assert(a); for(int i = 1;i < size ; i++) { int tem = a[i]; int end = i - 1; while( end >= 0 && a[end]>tem) { a[end+1] = a[end]; --end; } a[end+1] = tem; } }
希尔排序希尔排序(Shell Sort)是插入排序的一种。也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法。该方法因DL.Shell于1959年提出而得名。希尔排序是按照不同步长对元素进行插入排序,当刚开始元素很无序的时候,步长最大,所以插入排序的元素个数很少,速度很快;当元素基本有序了,步长很小,插入排序对于有序的序列效率很高。所以,希尔排序的时间复杂度会比o(n^2)好一些。正如下图650) this.width=650;" src="http://s1.51cto.com/wyfs02/M02/80/6D/wKiom1dBOjuTu0BWAAAxcKyEX04636.png" title="5.png" alt="wKiom1dBOjuTu0BWAAAxcKyEX04636.png" />此处,我的步长是以3为例,由上便可以看出,步长包括了整个数组。第一个是:2,9,8,1 --》1,2,8,9第二个是:5,3,7 ——》 3,5,7第三步是:4,6,1 -》 1,4,6代码如下
void ShellSort(int* a, size_t size) //希尔排序 { assert(a); int gap = size / 3; while(gap > 1) { gap = gap/3 + 1; //gap一直变小,知道它为1; for(int i = 0;i < (size - gap);++i) { int end = i; int tem = a[end + gap]; while( end >= 0 && a[end]>tem) { a[end+gap] = a[end]; end -= gap; } a[end+gap] = tem; } } }希尔排序的特点是不需要大量的辅助空间,和归并排序一样容易实现。希尔排序是基于插入排序的一种算法, 在此算法基础之上增加了一个新的特性,提高了效率。希尔排序没有快速排序算法快 O(n(logn)),因此中等大小规模表现良好,对规模非常大的数据排序不是最优选择。但是比O( N^2 )复杂度的算法快得多。并且希尔排序非常容易实现,算法代码短而简单。 此外,希尔算法在最坏的情况下和平均情况下执行效率相差不是很多,与此同时快速排序在最坏的情况下执行的效率会非常差。
相关文章推荐
- 常见的排序算法(二) 选择排序
- 常见的排序算法(三) 交换排序(冒泡排序,快速排序)
- 常见的排序算法(四)( 归并排序,计数排序 , 基数排序)
- Android框架中的广播机制
- 表达式转逆波兰式
- maven项目中手动安装jar包到自己本地仓库
- 菜鸟初长成
- 堆栈的区别
- 注释转换
- malloc和free的实现原理
- 程序编译过程
- 柔性数组
- pthread_create的浅析
- MySQL学习总结(三)索引
- 【android】:android之使用Intent
- 深度分析如何在Hadoop中控制Map的数量
- 《矩阵》——稀疏矩阵(Java)
- 写论文时有哪些格式上以及绘图等上的奇技淫巧?
- 第一章 C语言程序设计概述
- MongoDB基础之十 shared分片