排序之希尔排序
2015-11-20 11:58
309 查看
Shell Sort
希尔排序(Shell Sort)是插入排序的一种。是针对直接插入排序算法的改进。该方法又称缩小增量排序,因DL.Shell于1959年提出而得名。
该方法的基本思想是:先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序。因为直接插入排序在元素基本有序的情况下,效率是很高的,因此希尔排序在时间效率上比直接插入排序有较大提高。
在网上找到了演示图。
在上面这幅图中:
初始时,有一个大小为 10 的无序序列。
在第一趟排序中,我们不妨设 gap1 = N / 2 = 5,即相隔距离为 5 的元素组成一组,可以分为 5 组(21和54,一组,4和47一组……)。
接下来,按照直接插入排序的方法对每个组进行排序(变成了21和54比较,21在前面,4和47比较,4在前面……)。
在第二趟排序中,我们把上次的 gap 缩小一半,即 gap2 = gap1 / 2 = 2 (取整数)。这样每相隔距离为 2 的元素组成一组,可以分为 2 组。
按照直接插入排序的方法对每个组进行排序。
在第三趟排序中,再次把 gap 缩小一半,即gap3 = gap2 / 2 = 1。 这样相隔距离为 1 的元素组成一组,即只有一组。
按照直接插入排序的方法对每个组进行排序。此时,排序已经结束。
需要注意一下的是,若序列为(8,2,4,3,1,2),经过第一次排序变成(4,1,8,2,2,3)第一个2经过变换,变到了后面。也就是说,在排序过程中,两个相同元素的位置交换了。
所以,希尔排序是不稳定的算法。
希尔排序(Shell Sort)是插入排序的一种。是针对直接插入排序算法的改进。该方法又称缩小增量排序,因DL.Shell于1959年提出而得名。
该方法的基本思想是:先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序。因为直接插入排序在元素基本有序的情况下,效率是很高的,因此希尔排序在时间效率上比直接插入排序有较大提高。
在网上找到了演示图。
在上面这幅图中:
初始时,有一个大小为 10 的无序序列。
在第一趟排序中,我们不妨设 gap1 = N / 2 = 5,即相隔距离为 5 的元素组成一组,可以分为 5 组(21和54,一组,4和47一组……)。
接下来,按照直接插入排序的方法对每个组进行排序(变成了21和54比较,21在前面,4和47比较,4在前面……)。
在第二趟排序中,我们把上次的 gap 缩小一半,即 gap2 = gap1 / 2 = 2 (取整数)。这样每相隔距离为 2 的元素组成一组,可以分为 2 组。
按照直接插入排序的方法对每个组进行排序。
在第三趟排序中,再次把 gap 缩小一半,即gap3 = gap2 / 2 = 1。 这样相隔距离为 1 的元素组成一组,即只有一组。
按照直接插入排序的方法对每个组进行排序。此时,排序已经结束。
需要注意一下的是,若序列为(8,2,4,3,1,2),经过第一次排序变成(4,1,8,2,2,3)第一个2经过变换,变到了后面。也就是说,在排序过程中,两个相同元素的位置交换了。
所以,希尔排序是不稳定的算法。
#include<iostream> using namespace std; /***** function shellsort to sort ********/ void shellsort(int a[],int n) { //gap become half for(int gap = n / 2; gap > 0; gap /= 2) { //the number of groups is gap for(int i = 0; i < gap; i++) { //insertion sort in each group for(int j = i + gap; j < n; j += gap) { if(a[j] < a[j - gap]) { int tmp = a[j]; int k = j; while(k > 0 && a[k - gap] > tmp) { a[k] = a[k - gap]; k -= gap; } a[k] = tmp; } } } } } /***** main function to check ********/ int main() { int n,a[101]; cin>>n; for(int i =0; i < n; i++) { cin>>a[i]; } shellsort(a,n); for(int i =0; i < n; i++) { cout<<a[i]<<" "; } cout<<endl; return 0; }
相关文章推荐
- 【转】javax.net.ssl.SSLHandshakeException(Cas导入证书)
- 矢量图标的使用
- JAVA 泛型详解二
- 【论文笔记】Beyond frontal faces: improving person recognition using multiple cues
- iOS CGContextRef详解
- JavaScript基础——文档对象模型(DOM)
- Linux -- FresBSD的镜像文件说明
- IP网络5种基本寻址方式 (单播、多播、广播、任播、地域多播)
- linux下json库的编译及例程
- 微信公众号新浪百度云做服务器
- JAVA 泛型详解一
- iOS开发 免证书真机调试
- BBS热点事件探测
- ACE_Event_Handler
- XCode7打包/更新报错
- java技巧--提高代码运行效率
- Epoll 实例
- 数据库之字符串处理SQL语句
- CSS3:nth-child()伪类选择器,奇偶数行自定义样式first-child
- linux程序通过消息队列传输数据