希尔排序
在第一篇博客中论述了几种排序的方法,这里再论述一下另外一种排序方法:希尔排序
希尔(Shell)排序又称为缩小增量排序,它是一种插入排序。它是直接插入排序算法的一种威力加强版。
希尔排序的基本思想是:
把记录按步长 gap 分组,对每组记录采用直接插入排序方法进行排序。
随着步长逐渐减小,所分成的组包含的记录越来越多,当步长的值减小到 1 时,整个数据合成为一组,构成一组有序记录,则完成排序。
如下图所示:
因此,增量的选择很重要,如果增量的选择不合适,时间复杂度依然很高。
代码实现如下:
#include<iostream> using namespace std; int A[13] = {81,94,11,96,12,35,17,95,28,58,41,75,15}; //书上的版本 void Shellsort(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]; else break; A[j] = Tmp; } } } //我自己写的版本 void My_Shellsort(int A[], int N) { int i, j; int Increment = N / 2; int Tmp; while(1 <= Increment) { for(i = Increment; i < N; ++i) { Tmp = A[i]; for(j = i - Increment; j >= 0 && Tmp < A[j]; j = j - Increment) { A[j + Increment] = A[j]; } A[j + Increment] = Tmp; } Increment = Increment / 2; } } int main () { //Shellsort(A, 13); My_Shellsort(A, 13); for(int i = 0; i != 13; ++i) { cout << A[i] << " "; } cout << endl; return 0; }
希尔排序相当于改进版本的插入排序。
夜深了,,,
我还要预见几个你,才可以忘记你。