希爾排序C++實現

//shell sort
//希爾排序是一種對直接插入排序的改進方法,
//使用直接插入排序對於一個基本有序的數列進行排序時,內部循環的次數會明顯減少,因此可以減小時間複雜度;
//希爾排序就是先使數列基本有序,然後再直接插入排序,減小插入排序的時間複雜度;
//希爾排序首先按一定增量進行插入排序,再逐步縮減增量,當這一增量縮減至1時,希爾排序變爲直接插入排序;
//所以這一增量的選取很關鍵,且這一增量最後必須縮減至1;
//直接插入排序是一種穩定的排序方法,但希爾排序不是,因爲它是跳躍着排序;
//希爾排序雖然是一種比O(n^2)高效的排序算法,但複雜度仍比快速排序、堆排序等惡劣;

#include<vector>
#include<iostream>

using namespace std;

template<class type>
void shellSort(vector<type>& vec)
{
	int length=vec.size();

	int increment=length;
	while(increment>1)//增量最後必須縮減至1,否則無法保證有序
	{
		increment=increment/3+1;//增量縮減
		for(int i=increment;i<length;i++)
		{//按增量進行插入排序
			int key=vec[i];
			int j=i-increment;
			for(;j>=0;j-=increment)
			{//尋找key的正確插入位置
				if(vec[j]>key)//元素後移
					vec[j+increment]=vec[j];
				else
				{
					break;
				}
			}
			vec[j+increment]=key;//插入key
		}
	}
}

int main()
{
	int a[10]={1,5,6,0,2,8,3,7,9,4};
	vector<int> vec(a,a+10);
	shellSort(vec);

	for(int i=0;i<vec.size();++i)
	{
		cout<<vec[i]<<"   ";
	}
	cout<<endl;	
	return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章