C# 希尔排序
程序员文章站
2022-03-17 09:27:25
引用:对于大规模乱序数组插入排序很慢,因为它只会交换相邻的元素,因此元素只能一点一点的从数组的一端移动到另一端。例如,如果主键最小的元素正好在数组的尽头,要将它挪到正确的位置就需要N-1次移动。希尔排序为了加快速度简单的改进了插入排序,交换不相邻的元素以对数组的局部进行排序,并最终用插入排序将局部有 ......
引用:对于大规模乱序数组插入排序很慢,因为它只会交换相邻的元素,因此元素只能一点一点的从数组的一端移动到另一端。例如,如果主键最小的元素正好在数组的尽头,要将它挪到正确的位置就需要n-1次移动。希尔排序为了加快速度简单的改进了插入排序,交换不相邻的元素以对数组的局部进行排序,并最终用插入排序将局部有序的数组排序。
int[] sort = new int[13] { 1, 4, 89, 34, 56, 40, 59, 60, 39, 1, 40, 90, 48 }; // 输入一个数组
int h = 1;
int length = sort.length;
while (h > length / 3)
{
h = 3 * h + 1; // 1,4,13,40,121,364,1093,...
} // h的初始值根据数组元素多少而定
while (h >= 1) // 当h=1 时排序完成
{
for (int i = h; i < length; i++) // 将间隔为h的元素排序
{
for (int j = i; j >= h && sort[j] < sort[j - h]; j -= h) // 当满足这两个条件时交换 数值
{
int temp = sort[j];
sort[j] = sort[j - h];
sort[j - h] = temp;
}
}
h = h / 3;
}
for (int i = 0; i < sort.length; i++) // 输出
{
console.write(sort[i] + " ");
}
备注:文字和代码有参考到书籍:算法 第四版(人民邮电出版社) 希尔排序 (162-163)