先了解插入排序,再说希尔排序,因为希尔排序是改进版的插入排序。
那插入排序的思想是什么样的呢?插入排序的思想跟我们平常生活中的思想是一样的,假设你前面有三张牌,1,2,5,当然,都是有序的,那么,此时你手里也拿着一张牌,为3,那么怎么插入到前面的三张牌里呢?其实,我们的大脑不自觉的就会拿我们手里的3先跟5进行比较,3比5小,所以,3跟5要交换位置,然后3再跟2比,3比2大,那就不用交换,也不用再比下去了。这就是插入排序的思想。
给个定义吧(按照我原话复述):先把数组的第1个数当成是已经排好序的区间,那剩下的就是从第2个数开始往后就是未排好序的区间,也就是数组此时被分成有序和无序两个区间,然后怎么做呢?就是先以无序区间里的第一个数跟有序区间的最后一个数相比,比它小,就交换位置,依次这样比下去,直到找到合适的位置,形成一个新的有序区间,那么与原来相比,有序区间就多了一个成员,无序区间就少了一个成员,后面的以此类推。
以数组为5,2,3,1,9为例,按照以上说法,5会先被当做有序区间,剩下的2,3,1,9就被当做无序区间,然后再以无序区间为准,先从第一个数开始,也就是2,对有序区间的最后一个数依次向前比较,那么2跟5比,比5小,是不是就要交换位置呀,那就会变成2,5,3,1,9,再往前还有得比吗?没有了,没有的话第一轮结束,新的有序区间就是2,5,无序区间就是3,1,9,到第二轮,还是一样,先拿无序区间的第一个数3跟有序区间的最后一个数依次往前比较,直到找到合适的位置形成新的有序区间,以此类推,我就不再重复叙述了。
接下来看代码,如下:
public static void main(String[] args) {
int[] ins = {4,2,6,1,5,8};
//先从索引为1的位置开始,每次循环,代表一轮结束
for(int i=1; i<ins.length; i++){
//从有序区间的最后一个数开始依次往前面比较,所以j要--
for(int j=i; j>0; j--){
//符合条件的要交换位置
if(ins[j]<ins[j-1]){
int temp = ins[j-1];
ins[j-1] = ins[j];
ins[j] = temp;
}
}
}
System.out.println(Arrays.toString(ins));
}
以上就是插入排序的实现,接下来看希尔排序,前面我也说了,希尔排序是改进版的插入排序,那么希尔排序的思想是怎么样的呢?一句话,分步思想。什么意思?还是以数组为5,2,3,1,9为例,该数组的长度为5,那么我就让数组的长度除以2,得到2,那么也就是说,步数为2,可以拿插入排序来理解,像插入排序步数就为1,也就是要跟我前一个数进行依次比较,那2是不是就要跟我前第二个数进行依次比较呀!如下图:
代码如下:
public static void main(String[] args) {
int[] ins = {5,2,3,1,9};
for(int step=ins.length/2;step>0;step/=2){
for(int i=step; i<ins.length; i++){
for(int j=i; j>=step; j-=step){
if(ins[j]<ins[j-step]){
int temp = ins[j-step];
ins[j-step] = ins[j];
ins[j] = temp;
}
}
}
}
System.out.println(Arrays.toString(ins));
}
以上代码就是我由插入排序改造而来的希尔排序,细品,debug一下就知道了,我也不好每个代码都做个解释,但可以画个图,如下:

1487

被折叠的 条评论
为什么被折叠?



