希尔排序
- 优化版本的插入排序。
- 设置分组的步长,每一次步长减半。
- 每个分组后的数组(逻辑分组)做插入排序。
图示
运行结果
附上代码
#include <stdio.h>
#include <stdlib.h>
// 展示每次步长的排序情况
void show_sort(int arr[], int length, int step)
{
printf("步长为:%d\n", step);
for (int i = 0; i < length; i++)
{
printf("%d ", arr[i]);
}
printf("\n");
}
// 希尔排序
void shell_sort(int arr[], int length)
{
int i,j,temp,step;
// 初始增量step为长度的一半,每次遍历以后减半
for (step = length/2; step >= 1; step = step / 2)
{
// 对每个步长分组
for (i = step; i < length; i++)
{
temp = arr[i]; // 待插入的值
j = i - step; // 每一组的起始位置
// 对单个的组 做插入排序
while (j >= 0 && temp < arr[j])
{
arr[j + step] = arr[j]; // 从后开始挪动
j = j - step;
}
arr[j + step] = temp; // 插入元素
}
show_sort(arr, length, step);
}
}
int main()
{
int arr[10] = {4,5,2,7,1,8,3,9,0,6};
shell_sort(arr, 10);
return 0;
}