排序案例
9 | 2 | 5 | 6 | 11 | 1 | 7 | 8 |
---|
首先我们得了解一点希尔排序就是快速排序的升级版,在下面的过程中我们来演示它的原理是怎么样的。
如上序列中有8 个数,我们一般取增量gap=Arr.length/2
(gap也就意味着我们需要分组的个数)
在此案例中gap初始值为4,我们就可以分为
(9,11)(2,1)(5,7)(6,8)这四组数,对这四组数进行排序得到
(9,11)(1,2)(5,7)(6,8)
所以原序列变为
9 | 1 | 5 | 6 | 11 | 2 | 7 | 8 |
---|
这样一轮排序就结束了,gap/=2 即gap=2,我们就将此序列分为俩组
(9,5,11,7)(1,6,2,8)对这二组数进行排序得到
(5,7,9,11)(1,2,6,8)
所以原序列变为
5 | 1 | 7 | 2 | 9 | 6 | 11 | 8 |
---|
gap/=2 即gap=1,我们就将此序列分为一组
(5,1,7,2,9,6,11,8) 进行比较,此序列对于原序列来说就会相对有序一些,在此案例中我们可能看不太出来,但是在序列较长的情况下就会比较明显了。
排序完之后
原序列变为
1 | 2 | 5 | 6 | 7 | 8 | 9 | 11 |
---|
此时gap/=2 即gap=0,排序结束
下面附上源码实现
package sort;
import java.util.Arrays;
public class Shell {
public static int[] Sort(int[] sourceArray){
int arr []= sourceArray.clone();
int N =arr.length;
int gap =N/2; //增量设置
for (;gap>0;gap/=2) {
for (int i = gap; i < arr.length; i++) {
int tmp = arr[i]; //记录需要插入的数
int j = i;
while (j- gap >=0 && tmp < arr[j - gap]) {//当插入的数小于当前值时
arr[j] = arr[j - gap]; //向后移动一位
j=j-gap;
}
if (j != i) { //存在比其小的数,则插入
arr[j] = tmp;
}
}
}
return arr;
}
public static void main(String[] args) {
int arrs[]={50,11,2,4,5,48,90,20,19};
System.out.println(Arrays.toString(Sort(arrs)));
}
}
此文章创于本人学习时的记录,如有错误还请指正。