希尔排序
希尔排序就是高级版的插入排序,还挺快的。
- 它首先是将一个数组构建成多个列,就想堆排序需要先构建成二叉树一样,但是这个列 是自己想的 虚拟的 不会实质性的去改变数组的结构。
- 然后循环每列,将每列的数都进行排序,按递增或递减排序
- 当每列的值都排序好了,就再改变列数,就有点像插入排序了,看谁比这个数适合在哪儿
- 循环完成后 当列数只有1的时候就完成了排序
比如最开始数组的长度为10 那么构建列 最初就为5,第二次的列就为2,最后一次就为1 这样都排序好了
举个栗子:
- 首先需要排序的数为 {0,2,3,5,4,1,6,9,8,7},构建成列,就为5列(10/2=5 为什么要用2为基数?你自己想)
0 2 3 5 4
1 6 9 8 7
- 这里构建为5列了,然后进行排序(按递增)第一次循环后 {0,2,3,5,4,1,6,9,8,7},数据凑巧,没有发生变化 哈哈哈哈,然后第二次构建列 5/2=2
0 2
3 5
4 1
6 9
8 7
- 构建好2列后,进行循环排序,比较一列 然后如果当前需要比较的值小于前一个值 就将前一个值赋值到后一个 循环这一列 直到最开始,最后修改的位置为j 所以将j位置赋值为tmp,排序好后构建一列 最后在进行排序,排序后{0,1,3,2,4,5,6,7,8,9}
0 1
3 2
4 5
6 7
8 9
- 最后对一列开始排序,就完事儿了
CODE
public class Shell {
public static void main(String[] args) {
int[] num = {0,2,3,5,4,1,6,9,8,7};
shellSort(num);
for(int i: num){
System.out.print(i+" ");
}
}
public static void shellSort(int[] num) {
//控制列数 比如从5列到2列 到1列 就完事儿
for(int column = num.length/2; column > 0; column /= 2){
//从第一列 二的一个开始 一个一个走
for(int i = column; i < num.length; i++){
int tmp = num[i];
//定位最后的位置
int j;
//比较一列 然后如果当前需要比较的值小于前一个值 就将前一个值赋值到后一个 循环这一列 直到最开始
for(j = i; j >= column && num[j - column] > tmp; j -= column){
num[j] = num[j - column];
}
//最后修改的位置为j 所以将j位置赋值为tmp
num[j] = tmp;
}
}
}
}
它也是不稳定的!今天还有会儿才下班.芜湖,起飞!