基本原理:
希尔排序(Shell‘s Sort)的原理是将排序序列分成若干子序列依次进行插入排序。希尔排序是对插入排序的优化,引入步数概念,将序列分成若干子序列,对子序列进行插入排序。
希尔排序是非稳定排序算法。
优点:在极限情况下可以有效降低普通插入排序的时间复杂度。
代码实现:
int[] array = { 1, 11, 10, 5, 9, 7, 8, 6, 3, 2, 4};
//1. 第一轮:以数组长度的1/2为第一个步长,后面每一轮步长在原步长上除以2,步长小于1结束
for (int step = array.Length / 2; step > 0; step/=2)
{
//2. 在确定的步长下进行插入排序
for (int i = step; i < array.Length; i+=step)
{
//确定初始排序条件
//排序区与非排序区分界索引值
int sortIndex = i - step;
//非排序区第一个元素值
int noSortNumber = array[i];
//满足条件进入,序列元素向后移动一个步长
while (sortIndex >= 0 && noSortNumber < array[sortIndex])
{
array[sortIndex + step] = array[sortIndex];
sortIndex -= step;
}
array[sortIndex + step] = noSortNumber;
}
}
for (int i = 0; i < array.Length; i++)
{
Console.Write($"{array[i]} ");
}
总结:
-
设置步长,步长不停缩短;
-
三层循环,一层获取步长,一层索引值获取未排序区元素,一层找到合适位置插入。