1.希尔排序
将待排序数组按照步长进行分组,然后将每组的元素利用直接插入排序的方法进行排序,每次将步长折半减小,gap=1时,利用直接插入完成排序。
1)第一层循环将gap依次折半,对序列进行分组直到gap=1;
2)第二、三层循环利用直接插入排序的两次循环
2.图例
3.算法
//希尔排序
void shellSort(int *arr, int num)
{
// 9,1,2,5,7,4,8,6,3,5进行排序 第一次gap = 5;
for (int gap = num/2;gap > 0;gap /= 2)
{
for (int i = gap;i < num;i++)
{
//进行分组插入排序,gab = 5时,arr[i]和arr[gap+i]比较
for (int j = i; j - gap >= 0 && arr[j - gap] > arr[j]; j -= gap)
{
//交换
swap(arr[j - gap], arr[j]);
}
}
}
}
void printArr(int *arr, int num)
{
for (int i = 0;i < num;i++)
{
cout << arr[i] << " ";
}
}
int main()
{
int a[] = { 9,1,2,0,5,7,4,8,6,3,5 };
cout << "排序前: " << endl;
printArr(a, 11);
shellSort(a, 11);
cout << "\n";
cout << "排序后: " << endl;
printArr(a, 11);
return 0;
}
4.运行截图