C++實現謝爾排序(希爾排序)(shell sort)
謝爾排序和插入排序還是有類似的,可以說插入排序是謝爾排序中必經的一步,或者說是特殊的一種情況。因為謝爾排序需要使用一個增量序列
為什麼謝爾排序效率一般來說比插入排序更高?直觀的想,如果待排序列比較有序,插入排序效果會大大提高。那麼對於
下面記錄一下今天的程式碼:
#include<iostream>
#include<vector>
#include<random>
#include<ctime>
#include<iterator>
#include<algorithm>
using namespace std;
/*
* 謝爾排序,從小到大
* 採用 Hibbard 提出的增量序列
*/
template<typename T>
void shellSort(vector<T> & a)
{
size_t gap;
for (gap = 0; gap < a.size() / 4; gap = gap * 2 + 1); // 根據a的尺寸獲得增量序列的最大值
for (; gap > 0; gap = (gap - 1) / 2)
{
for (size_t i = gap; i < a.size(); ++i)
{
T tmp = a[i]; // 臨時儲存待尋找位置的值(因為每一趟相當於一次插入排序)
size_t j = i;
for (; j >= gap && tmp < a[j - gap]; j -= gap)
a[j] = a[j - gap];
a[j] = tmp;
}
}
}
template<typename T>
void printVector(vector<T> & v)
{
copy(v.cbegin(), v.cend(), ostream_iterator<T>(cout, " "));
cout << endl;
}
int main()
{
vector<int> source;
uniform_int_distribution<int> u(0, 100);
default_random_engine e(static_cast<unsigned int>(time(0)));
for (int i = 0; i < 30; i++)
{
source.push_back(u(e));
}
cout << "排序前:" << endl;
printVector(source);
shellSort(source);
cout << "排序後:" << endl;
printVector(source);
int a;
cin >> a;
return 0;
}
執行結果為