希尔排序为了加快速度简单的改进了插入排序,交换不相邻的元素以对数组的局部进行排序,并最终用插入排序对局部有序的数组排序。
思路:使数组中任意间隔为h的元素都是有序的,这样的数组成为h有序数组,在进行排序时,如果h很大,我们就能将元素移动到很远的地方
以下方法从N/3开始递减至1
#include <iostream>
void SHELLSORT(int A[], int size)
{
int h = 1;
while (h < size / 3)
{
h = 3 * h + 1;
}
while (h >= 1)
{
for (int i = h; i < size; i++)
{
for (int j = i; j >= h && A[j] < A[j - h]; j -= h)
{
std::swap(A[j], A[j - h]);
}
}
h = h / 3;
}
}
int main()
{
int A[] = { 1,4,6,4,7,4,10,50,88,2,33,56,3,345,66,67,4 };
SHELLSORT(A, sizeof(A) / 4);
for (auto a : A)
{
std::cout << a << " ";
}
}