1、思路
希尔排序:也叫做缩小增量排序。分组排序(分组的组数需要循环递减,直到只剩一组);
先将待排序序列分成若干组,然后再使用直接插入排序在组内排序。外循环控制组数减少,内循环控制直接插入排序。
所有的分组数都互为质数;
2、希尔排序代码
void Shell(int *arr, int len, int width)
{
for(int i = width; i < len; ++i)
{
int tmp = arr[i];
int j = i - width;
for(; j >= 0 && arr[j] > tmp; j -= width)
{
arr[j+width] = arr[j];
}
arr[j+width] = tmp;
}
}
void ShellSort(int *arr, int len)
{
int group[] = {5, 3, 1};
for(int i = 0; i < sizeof(group)/sizeof(group[0]); ++i)
{
Shell(arr, len, group[i]);
}
}
3、完整代码
#include <stdio.h>
void Shell(int* arr, int len, int width)
{
for (int i = width; i < len; ++i)
{
int tmp = arr[i];
int j = i - width;
for (; j >= 0 && arr[j] > tmp; j -= width)
{
arr[j + width] = arr[j];
}
arr[j + width] = tmp;
}
}
void ShellSort(int* arr, int len)
{
int group[] = { 5, 3, 1 };
for (int i = 0; i < sizeof(group) / sizeof(group[0]); ++i)
{
Shell(arr, len, group[i]);
}
}
void ShowArr(int* arr, int len)
{
for (int i = 0; i < len; i++)
{
printf("%d ",arr[i]);
}
}
int main()
{
int arr[] = { 10, 47, 23, 21, 1, 33, 89 };
ShellSort(arr, sizeof(arr) / sizeof(int));
ShowArr(arr, sizeof(arr) / sizeof(int));
return 0;
}
4、测试结果
5、算法分析
时间复杂度: 时间复杂度是与增量序列相关的函数 O(n^1.3~1.5)
空间复杂度: O(1)
稳定性: 不稳定