C++希爾排序

Cathy _Mmm發表於2020-11-09

希爾排序的思想較為巧妙,它的思想:將要排序的檔案分為n個組,距離為s的分為一組,再將這一組進行排序,完成這個操作之後,再將s的值變小繼續排序直到距離為零時

  1. 下圖進行第一次排序:首先要知道一個距離的值,這個值可以設為陣列長度的一半(超過的話第一次排序不能將所有的數值都排序一次),在本案例中為4,初始值可以設為從下標為4的元素開始,這樣正好可以使這個陣列從下標為0的位置比較,元素都可以進行排序一遍
  2. 第一遍時,距離較大,每組所記錄數較少,所以速度較快。後面的幾次排序時,距離就會縮小,縮小的原則為除以2,在第二次排序時,明顯每組的記錄數就變多了,但是由於在第一遍排序的基礎上,排序的速度並不會慢
    在這裡插入圖片描述
  3. 在排序的過程中:還是以上圖為例子,在下標為7的元素再進行排序時,他首先與下標為i=7-4的數比較,前者是小於後者的(在此為升序),所以要將這個較大的數放在這個數的下標加距離位置(也就是下標為7的位置),那麼當前的這個元素還要繼續比較,他與7-4這個位置再減4(即i-4=-1)的位置比較,結果這個位置不存在,那麼本次的比較結束,且當前下標的值插入在i+4的位置
    在這裡插入圖片描述
  4. 當距離為1時已經可以將所有的元素都排序一遍,且由於前面的排序使得後面的排序變得快速

程式碼如下:

shellSort(int arr[],int len,int n){
	//len為arr的長度,n為希爾排序的分組間隔
	int i,j,temp,k;
	for(i=n;i>0;i>>=1){
		for(j=i;j<len;j++){
			temp = arr[j];
			k = j-i;
			while(k >= 0 && temp < arr[k]){
				arr[k + i] = arr[k];
				k-=i;
			}
			arr[k+i] = temp;
		}
	} 
}

相關文章