希尔排序:
大概思路,排序时按照一个步进step来进行比较大小,交换顺序,如步进长度为13时,则从13开始,与0进行比较,若比0小则与0交换位置。
继续从14开始,14则与1进行比较,若小于1则与1交换位置。当进行到26时,26会与13进行比较,若比13小,则与13交换位置,然后再与0比较,若比0小,再交换位置。
依次类推,知道循环至n - 1.
一次步进结束后,将步进减小,在书上看到的步进step的得出公式是 step = step*3 + 1(ste从0开始)\。
比如一个100个元素的数组,它的n是从40开始的。次位是13,13*3 + 1 < 100。故可以从40的步进开始。
每次一次步进结束后,step = (step-1)/ 3。
public void sort() {
int temp = 0;// 用来保存某次要交换的数据
int outer = 0;// 外层for循环,控制遍历整个数组
int inner = 0;// 内存循环,控制遍历当前元素往后的一个步进单位,二个步进单位...
int step = 0;// 步进
int length = param.length;
while (step < length) {// 给步进设置初始值
step = step * 3 + 1;
}
while (step > 0) {
for (outer = step; outer < length; outer++) {
temp = param[outer];
inner = outer;
while (inner - step >= 0 && param[inner - step] >= temp) {
param[inner] = param[inner - step];
inner -= step;
}
param[inner] = temp;
}
step = (step - 1) / 3;
}
}