希尔排序个人理解


  将整个数组,每次按照2的倍数长度进行比较。先比较前两个,如果第一个比第二个大则进行交换,否则不变。在进行2的倍数比较时,比如四个数进行比较时。先进行前两个数的比较,然后将第三个数
按照插入排序算法进行插入。

其算法如下:

public static void shellSort(int[] array){
                //数组的长度,用于每次进行2的倍数进行比较和插入排序进行使用
                int length=array.length;
                //变量i:将要与前一部分进行比较的后一部分,也是临时变量的下标。
                //变量j:与后一部分相差h长度的前一部分。
                //变量temp:用于保存临时变量array[i]
                //变量h:前一部分与后一部分相差的长度。
                int i,j,temp,h;
                //每次将长度减半,减半之后进行比较
                for(h=length/2;h>0;h=h/2){
                    //从下标为h开始,刚好是第二个将要比较的数
                    for(i=h;i<length;i++){
                        //将比较数保存在临时变量中,用于与前几位数进行比较,如果每次有一个数大于该数
                        //数组上的数都会向后移动一位,最后将该临时变量置于空出的那一个位置。
                        temp=array[i];
                        //数组每次都会进行插入排序比较,隔着距离h
                        for(j=i-h;j>=0;j-=h){
                            //如果临时变量小于前一个用于比较的数位置为j,那么将前一个用于比较的数放置
                            //于后一个数上,位置为j+h,否则退出此次循环。
                            if(temp<array[j]){
                                array[j+h]=array[j];
                            }else{
                                break;
                            }
                        }
                        //将临时变量放置于与前几位数比较后的位置
                        array[j+h]=temp;
                    }
                }
            }
原文地址:https://www.cnblogs.com/orchid9/p/7611892.html