希尔排序

来源:互联网 发布:淘宝上的护肤品能买吗 编辑:程序博客网 时间:2024/06/05 04:38

基本思想:将需要排序的序列划分为若干个较小的序列,对这些序列进行直接插入排序,通过这样的操作可使需要排序的数列基本有序,最后再使用一次直接插入排序对整个数列进行排序。

划分子序列:取上一个增量的一半作为此次子序列划分的增量,一般初始值取元素的总数量。


有8个元素


数组:69     65     90      1      50      30    70     9

下标:0        1        2       3        4       5      6       7

1.设置增量为8/2=4,从下标为4的元素开始,一直和与它相差4的下标元素相比,即50和69比较,30和65比较,70和90比较,9和1比较

排序结果为:50  30  70  1   69  65  90   9

                       0    1    2    3    4    5     6    7

2.设置增量为4/2=2,从下标为2的元素开始开始比

(1)下标为2的70和50相比,大于50不交换,下标加1为3

(2)下标为3的1和30相比,小于交换位置,下标加1继续向后比

数组为:50  1  70  30  69  65  90  9

               0    1   2    3   4     5    6   7

(3)下标为4的 69先和70比,小于70交换位置,然后69再和与70下标相差2的元素相比,69和50比,大于它不交换位置,下标加1

数组为:50  1  69  30  70  65  90  9

               0    1   2    3   4     5    6   7

(4)下标为5的65先和与它下标相差2的30比,大于它不交换,下标加1

(5)下标为6的90和70相比,大于它,下标加1

(6)下标为7的9先和65比,小于65,65放在下标为7的位置,然后9再和下标为3的30相比,小于30,将30放在下标为5的位置,9和下标为1的1相比,大于1,将9放在下标为3的位置,继续下一个元素

数组为:50  1  69   9  70  30  90  65

               0    1   2    3   4     5    6   7


3.设置增量为2/2=1

(1)1和50相比,小于50交换位置,1 50  69  9 70  30  90  65

(2)69先和50比,大于50,不交换

(3)9和它前面的元素从69开始依次向前比,直到找到小于9的元素1,将9插入1前面,数组为1 9  50  69  70  30  90  65

(4)70和69比,大于69不交换

(5)30和它前面的元素依次相比找到第一个小于30的元素9,将30插入9的后面,数组为1 9  30  50 69  70  90  65

(6)90和70比,大于不交换

(7)65和它前面每一个元素比较,直到找到小于65的元素50,将65插入,1 9 30 50 65  69  70  90 



希尔排序算法时间复杂度:O(nlogn)

#include <iostream>using namespace std;//希尔排序void ShellSort(int * data,int length){if(data==NULL||length<=0)return;int d,i,j,temp;d=length/2;while(d>=1){for(i=d;i<length;i++){temp=data[i];j=i-d;//i之前第一个与i相差增量d的元素的下标while(j>=0&&data[j]>temp)//如果data[j]大于当前元素{data[j+d]=data[j];//将data[j]向后移动j=j-d;//继续向前找与j相差d的元素的下标}data[j+d]=temp;}d=d/2;//缩小增量}}int main(){int data[]={69,65,90,1,50,30,70,9};ShellSort(data,8);for(int i=0;i<8;i++){cout<<data[i]<<endl;}return 0;}


0 0