1. 程式人生 > >Shell(希爾)排序

Shell(希爾)排序

shell排序演算法描述:

我們簡單處理增量序列:增量序列d = {n/2 ,n/4, n/8 …..1} n為要排序數的個數 ,即:先將要排序的一組記錄按某個增量d(n/2,n為要排序數的個數)分成若干組子序列,每組中記錄的下標相差d。對每組中全部元素進行直接插入排序,然後再用一個較小的增量(d/2)對它進行分組,在每組中再進行直接插入排序。繼續不斷縮小增量直至為1,最後使用直接插入排序完成排序。

Shell排序示例如下:

程式碼實現如下:

#include<stdio.h>
void ShellSort(int arr[],int n){
	int step=n/2;		//取增量 
	while(step>=1){
		for(int i=step;i<n;i++){
			int temp=arr[i];       //從這一行開始就是直接插入排序 
			int j;
			for(j=i-step;j>-1&&temp<arr[j];j-=step){    
				arr[j+step]=arr[j];
			}
			arr[j+step]=temp;	//直接插入排序到這裡結束,其實把step換成1就是直接插入排序了。 
		}
		step=step/2;    //每一次把增量除以2
	}
}

 int main(void)
 {
 	int a[8]={4,2,5,8,3,7,6,9};
 	ShellSort(a,8);
 	for(int i=0;i<8;i++)
 	printf("%4d",a[i]);
  } 

 

Shell排序的時間效能優於直接插入排序:

希爾排序的時間效能優於直接插入排序的原因:

①當檔案初態基本有序時直接插入排序所需的比較和移動次數均較少。

②當n值較小時,n和n^2的差別也較小,即直接插入排序的最好時間複雜度O(n)和最壞時間複雜度0(n^2)差別不大。

③在希爾排序開始時增量較大,分組較多,每組的記錄數目少,故各組內直接插入較快,後來增量di逐漸縮小,分組數逐漸減少,而各組的記錄數目逐漸增多,但由於已經按di-1作為距離排過序,使檔案較接近於有序狀態,所以新的一趟排序過程也較快。

因此,希爾排序在效率上較直接插入排序有較大的改進。

總結:Shell排序時間複雜度:在最優的情況下,時間複雜度為:O(n ^ (1.3) ) (元素已經排序好順序)

在最差的情況下,時間複雜度為:O(n ^ 2)。它是一種不穩定的插入排序。