排序系列算法——希尔排序
2016-01-22 16:24
363 查看
希尔排序可以说是插入排序的加强版,通过对原始数据进行分组再排序,更高效地完成对数据的排序工作。
1.从插入排序到希尔排序
回顾插入排序的基本知识,插入排序通过不断将无序的元素插入到已排序的序列中,直到所有的元素都已经插入位置。
![](https://images2015.cnblogs.com/blog/833682/201601/833682-20160122161635937-1555331252.png)
插入排序一个很明显的缺点是插入元素时需要与已经排序的元素进行对比,对比的次数可能会比较多,考虑最坏的情况,如果原始的数组是倒序的,每插入一个元素时都要跟所有已经排好序的元素进行对比,算法的效率很低。
但是如果插入元素时对比的次数较少,能够大大提高算法的效率,希尔排序就是通过将元素数组划分为若干小组,然后对各个小组进行插入排序来减低元素之间对比的次数,提高排序的效率。
2.希尔排序的执行过程
希尔排序首先选择一个元素选择步长将数组划分为若干小组,对各个小组分别进行排序,然后不断将步长缩小,不断分组和排序,直到后的步长为1,对所有的元素进行排序,此时,经过前期的排序工作,能够减少全体元素插入排序的对比次数,大大降低了排序的时间复杂度。
以一个实际的例子说明希尔排序的执行过程:
将数组{13,7,3,8,12,510,2}从小到大进行排序。
第一次分组排序:选择步长8/2=4,图下方的数组表示分组情况
![](https://images2015.cnblogs.com/blog/833682/201601/833682-20160122162209187-625522475.png)
![](https://images2015.cnblogs.com/blog/833682/201601/833682-20160122162221734-832310805.png)
第二次排序:选择步长4/2=2;
![](https://images2015.cnblogs.com/blog/833682/201601/833682-20160122162235797-1474160725.png)
![](https://images2015.cnblogs.com/blog/833682/201601/833682-20160122162242906-1180615454.png)
第三次分组排序:选择步长2/2=1;
![](https://images2015.cnblogs.com/blog/833682/201601/833682-20160122162251453-443543877.png)
![](https://images2015.cnblogs.com/blog/833682/201601/833682-20160122162257562-2109360022.png)
3.C++源码
1.从插入排序到希尔排序
回顾插入排序的基本知识,插入排序通过不断将无序的元素插入到已排序的序列中,直到所有的元素都已经插入位置。
![](https://images2015.cnblogs.com/blog/833682/201601/833682-20160122161635937-1555331252.png)
插入排序一个很明显的缺点是插入元素时需要与已经排序的元素进行对比,对比的次数可能会比较多,考虑最坏的情况,如果原始的数组是倒序的,每插入一个元素时都要跟所有已经排好序的元素进行对比,算法的效率很低。
但是如果插入元素时对比的次数较少,能够大大提高算法的效率,希尔排序就是通过将元素数组划分为若干小组,然后对各个小组进行插入排序来减低元素之间对比的次数,提高排序的效率。
2.希尔排序的执行过程
希尔排序首先选择一个元素选择步长将数组划分为若干小组,对各个小组分别进行排序,然后不断将步长缩小,不断分组和排序,直到后的步长为1,对所有的元素进行排序,此时,经过前期的排序工作,能够减少全体元素插入排序的对比次数,大大降低了排序的时间复杂度。
以一个实际的例子说明希尔排序的执行过程:
将数组{13,7,3,8,12,510,2}从小到大进行排序。
第一次分组排序:选择步长8/2=4,图下方的数组表示分组情况
![](https://images2015.cnblogs.com/blog/833682/201601/833682-20160122162209187-625522475.png)
![](https://images2015.cnblogs.com/blog/833682/201601/833682-20160122162221734-832310805.png)
第二次排序:选择步长4/2=2;
![](https://images2015.cnblogs.com/blog/833682/201601/833682-20160122162235797-1474160725.png)
![](https://images2015.cnblogs.com/blog/833682/201601/833682-20160122162242906-1180615454.png)
第三次分组排序:选择步长2/2=1;
![](https://images2015.cnblogs.com/blog/833682/201601/833682-20160122162251453-443543877.png)
![](https://images2015.cnblogs.com/blog/833682/201601/833682-20160122162257562-2109360022.png)
3.C++源码
void ShellSort(int array[]){ int index = sizeof(array)/2; int temp=0; while(index>=1){ for(int i=index;i<length;i++){ for(int j=i-index;j>=0;j-=index){ if(array[j]>array[j+index]){ temp = array[j]; array[j] = array[j+index]; array[j+index]=temp; } } } index = index/2; } }
相关文章推荐
- Windows Azure Virtual Machine (29) 修改Azure VM 数据磁盘容量
- Maven_如何为开发和生产环境建立不同的配置文件 --我的简洁方案
- android 圆形图片多种实现方式
- Java实体类的属性类型与数据库表字段类型对应表
- MongoDB 3.0 新增特性一览
- MongoDB 3.0 新增特性一览
- 安卓socket通讯
- 避免掩蔽继承而来的名称
- 编写2440bootloader
- 视频
- Ionic在Android上部署app步骤
- FastDFS 安装
- Win7系统如何开启蓝牙?Win7笔记本开启蓝牙的方法
- 判断CStrnig 字符串是否为double类型的变量
- java简单的多线程实现
- 我眼中的前端开发
- 设计模式之Builder模式
- Android使用Webview显示网页
- (四)为Android系统的Application Frameworks层增加硬件访问服务
- lightoj1021- Painful Bases