//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;
}
希爾排序C++實現
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.