Shell Sort 希尔排序
是插入排序的升级版, 如果会插入排序, 希尔排序会变得非常简单;
插入排序是以步长为1的, 而希尔排序步长更大, 有效的减少实践复杂度
先来看插入排序
void insertSort(int data[],int n)
{
for (int i = 1; i < n; i++)
{
int temp = data[i];
int j = i - 1;
while (j >= 0 && data[j]>temp) //data[j]从右往左移动,直到找到一个比temp小的data[j](即data[j]<=temp)(即data[j]越往左移值越小)循环结束,可知这是一个升序排序
{
data[j + 1] = data[j];
j--;
}
data[j + 1] = temp;
}
}
再来看希尔排序
vector<int>G;
void insertSort(int data[],int n,int g)
{
for (int i = 1; i < n; i++)
{
int temp = data[i];
int j = i - g;
while (j >= 0 && data[j]>temp) //data[j]从右往左移动,直到找到一个data[j]<=temp循环结束,可知这是一个升序排序
{
data[j + g] = data[j];
j-=g;
}
data[j + g] = temp;
}
}
void shellSort(int data[], int n)
{
for (int g = 1; g <= n; g = 3 * g + 1) //生成一个由g构成的集合G
G.push_back(g);
for (int i = G.size() - 1; i >= 0; i--)
insertSort(data, n, G[i]);
}
希尔排序保留了插入排序,但是这个插入排序不再以步长1移动,而是G,G是一个集合, G=1,4,13....,即插入排序的步长是在变的