排序演算法總結之希爾排序

飛翔的黃瓜發表於2017-08-01

希爾排序是按照不同步長對元素進行插入排序,實質就是把一組元素分為很多小組各自進行排序。

該方法的基本思想是:先將整個待排元素序列分割成若干個子序列,分別進行直接插入排序,然後元素的分隔逐漸減少,當增量足夠小(即為1時),再對全體元素進行一次插入排序,因為直接插入排序在元素基本有序的情況下(接近最好情況),效率是很高的,因此希爾排序時間效率比較高。

這裡用下別人的圖

以n=10的一個陣列49, 38, 65, 97, 26, 13, 27, 49, 55, 4為例

第一次 gap = 10 / 2 = 5

49   38   65   97   26   13   27   49   55   4

1A                                        1B

        2A                                         2B

                 3A                                         3B

                         4A                                          4B

                                  5A                                         5B

這裡就分了5組,每組都進行一次插入排序,完成之後,改變間距

第二次 gap = 5 / 2 = 2

排序後

13   27   49   55   4    49   38   65   97   26

1A             1B             1C              1D            1E

        2A               2B             2C             2D              2E

如圖分為兩組,再次進行插入排序,然後繼續減小間距,知道間距為1,所以希爾排序就是把直接插入排序用了多回的演算法 ,程式碼如下

void ShellSort(int a[],int N)//N是待排元素個數
{
	int tmp,i;
	for(int gap=N/2;gap>0;gap/=2)//希爾排序增量
		for(int j=gap;j<N;j++)//各組元素交替插入排序
	       {	tmp=a[j];
                for(i=j;i>=gap&&a[i-gap]>tmp;i-=gap)
					a[i]=a[i-gap];
				a[i]=tmp;
	}

}
希爾排序平均時間複雜度為O(n(1.3)),最好是O(n),最壞情況O(n(2)),並且是不穩定的



相關文章