希尔排序是对插入排序的一种改进,具体的时间复杂度本人还没有完全理解,只是明白了它是怎么运行的。
希尔排序基本思想:
先取一个小于n的整数d1作为第一个增量,把文件的全部记录分成d1个组,所有距离为d1的倍数的记录放在同一个组中。先在各组内进行直接插入排序;然后,取第二个增量d2<d1重复上述的分组和排序,直至所取的增量dt=1(dt<dt-l<…<d2<d1),即所有记录放在同一组中进行直接插入排序为止。该方法实质上是一种分组插入方法。
#include <iostream>
#include <vector>
#include <iterator>
using namespace std;
template <class Comparable>
void shellSort(vector<Comparable> &data)
{
int size = data.size();
for(int gap = size/2; gap > 0; gap /= 2)
{
for(int i=gap; i<size; ++i)
{
Comparable temp = data[i];
int j;
for(j = i; j >= gap && temp < data[j-gap]; j -= gap)
{
data[j] = data[j-gap];
}
data[j] = temp;
}
}
}
int main(void)
{
int ary[] = {1,7,2,6,3,5,4,8,9,0};
int len = sizeof(ary)/sizeof(int);
vector<int> v(ary, ary+len);
shellSort(v);
copy(v.begin(), v.end(), ostream_iterator<int>(cout, " "));
cout << endl;
return 0;
}