排序演算法__希爾排序

Enjoy_process發表於2019-03-08

                                                排序演算法__希爾排序

 

 

一、介紹

希爾排序(Shell Sort)是插入排序的一種,它是針對直接插入排序演算法的改進。該方法又稱縮小增量排序。希爾排序實質上是一種分組插入方法。它的基本思想是:對於n個待排序的數列,取一個小於n的整數len(len被稱為步長)將待排序元素分成若干個組子序列,所有距離為len的倍數的記錄放在同一個組中;然後,對各組內的元素進行直接插入排序。 這一趟排序完成之後,每一個組的元素都是有序的。然後減小len的值,並重復執行上述的分組和排序。重複這樣的操作,當len=1時,整個數列就是有序的。由於多次插入排序,我們知道一次插入排序是穩定的,不會改變相同元素的相對順序,但在不同的插入排序過程中,相同的元素可能在各自的插入排序中移動,最後其穩定性就會被打亂,所以shell排序是不穩定的。

二、C++實現

#include<iostream>

using namespace std;

void shellSort(int a[],int n)
{
	for(int len=n/2;len>0;len/=2)//len表示步長 ,每次縮小一半 
	{
		//將陣列a分為len個組 
		for(int i=0;i<len;i++)//對每個組進行直接插入排序 
		{
			for(int j=i+len;j<n;j+=len)
			  if(a[j]<a[j-len])
			  {
			  		int tmp=a[j];
			  		int k=j-len;
			  		while(k>=0&&a[k]>tmp)
			  		{
			  			a[k+len]=a[k];
			  			k-=len;
					}
					a[k+len]=tmp;
			  }
		}
	}
}

int main()
{
	int a[]={10,9,8,7,6,5,4,3,2,1};
	int len=sizeof(a)/sizeof(a[0]);
	printf("排序前:");
	for(int i=0;i<len;i++)
	  printf("%d ",a[i]);
	shellSort(a,len);
	printf("\n排序後:");
	for(int i=0;i<len;i++)
	  printf("%d ",a[i]);
	return 0;
}

三、時間複雜度 

O(n^{1.3})~O(n^{2})

 

相關文章