算法思想
- 减少元素查找次数
- 减少元素移动次数
算法精髓(假设进行升序排序)
- 一共有n个待排序元素。
- 第一轮按每隔
n = n/2 - 1
个元素分为一组,划分为若干组。 - 在每一组内各自用插入排序使各自组内元素有序。
- 第二轮按
n = n/2 - 1
个元素再分为若干组,各组内进行组内排序 - 直到
n = 0
时整个数组为一组,进行插入排序
实现
//数组首地址,数组长度,分组起始位置,步长
void group_sort(int arr[], int length, int start, int step)
{
for (int ii = start + step; ii < length; ii += step)
{
int tmp = arr[ii];
int j = ii - step;
while (j >= start && arr[j] >= tmp)
{
arr[j + step] = arr[j];
j -= step;
}
arr[j + step] = tmp;
}
return;
}
//普通实现:44,3,38,5,47,15,36,26,27,2,46,4,19,50,48
void Shell_sort(int arr[], int length)
{
//step为步长
for (int step = length/2;step > 0;step /= 2)
{
for (int i = 0; i < step; i++)
{
group_sort(arr, length, i, step);
}
}
return;
}
测试
int main()
{
int arr[] = { 44,3,38,5,47,15,36,26,27,2,46,4,19,50,48 };
Shell_sort(arr, 15);
for (size_t i = 0; i < 15; i++)std::cout << arr[i] << '\t';
std::cout << std::endl;
return 0;
}
分析
时间复杂度:O(n^2)(最坏情况)
空间复杂度:O(1)