希尔排序--改良版插入排序
不论你在什么时候开始,重要的是开始之后就不要停止;不论你在什么时候结束,重要的是结束之后就不要悔恨。
Part 1
算法背景
插入排序法本质上是由未排序的后半部前端取出一个值,插入已排序前半部的适当位置。总的来说,概念简单但速度不快。
加快排序效率,基本原则之一就是让后一次的排序进行时,尽量利用前一次排序后的结果。希尔排序(Shell排序法)即是基于此一概念来改良插入排序法。
Part 2
算法解析
希尔排序样例
解法:假设要排序的元素有n个,则每次进行插入排序时并不是所有的元素同时进行时,而是取一段间隔。
对数据11 2 10 8 16 33进行希尔排序步骤如下:
第一次排序间隔:6 / 2 = 3
第一次排序结果:8 2 10 11 16 33
第二次排序间隔:3 / 2 = 1
第二次排序结果:2 8 10 11 16 33
最终经过二次插入排序,生成的结果为2 8 10 11 16 33.相较于常规的插入排序算法,效率有了很大的提升。
Part 3
算法实现
public class ShellSort {
void sort(int number[]) {
int Max = number.length;
int gap = Max / 2;
while (gap > 0) {
for (int kk = 0; kk < gap; kk++) {
for (int ii = kk + gap; ii < Max; ii += gap) {
for (int jj = ii - gap; jj >= kk; jj -= gap) {
if (number[jj] > number[jj + gap]) {
int temp;
temp = number[jj + gap];
number[jj + gap] = number[jj];
number[jj] = temp;
} else {
break;
}
}
}
}
System.out.println("gap = " + gap);
for (int ii = 0; ii < Max; ii++) {
System.out.print(number[ii] + " ");
}
System.out.println();
gap /= 2;
}
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入待排序的数据(例如:11 2 10 8 16 33):");
String input = scanner.nextLine();
scanner.close();
String[] str = input.split(" ");
int number[] = new int[str.length];
for (int i = 0; i < number.length; i++) {
number[i] = Integer.parseInt(str[i]);
}
ShellSort shellSort = new ShellSort();
shellSort.sort(number);
}
}
运行结果:
往期精彩回顾
长按二维码识别关注