排序:希尔排序

来源:互联网 发布:windows如何隐藏分区 编辑:程序博客网 时间:2024/05/22 05:00

1.概述

希尔排序是突破时间复杂度为O(n2)的第一批算法。

我们分析直接插入排序,当我们的记录是基本有序的时候,只需要少量的插入操作就可以完成整个记录的排序工作,此时直接插入很高效。还有就是记录比较少的时候,直接插入的优势也比较明显。我们把原本有大量记录数的记录进行分组分割成若干个子序列,此时每个子序列待排序的记录数就比较少了,然后对这些子序列分别进行直接插入排序,当整个序列都基本有序时,再对全体记录进行一次直接插入排序。所谓的基本排序,就是小的关键字基本在前面,大的基本在后面,不大不小的基本在中间。

我们采取跳跃分割的策虐,将相距某个“增量”的记录组成一个子序列,这样才能保证在子序列内分别进行直接插入序列后得到的结果是基本有序而不是局部有序。

2.实现

 void shell_sort(int A[],int N) { int i,j,increment; int tmp; for(increment=N/2;increment>0;increment/=2) {for(i=increment;i<N;i++){tmp=A[i];for(j=i;j>=increment;j-=increment){if(tmp<A[j-increment])A[j]=A[j-increment];elsebreak;}A[j]=tmp;} } }


3.分析

增量的选取非常关键,time=O(n3/2)要好比直接排序的O(n2),增量序列的最后一个增量值必须等于1才行。

0 0