排序算法-直接插入排序(希尔)

思路:

1.i从0开始,j从i+1开始,j往前比较如果比他大(小)交换,直到不能交换为止,说明找到了插入位置,一次遍历完成。

 

public class InsertSort {
    // 直接插入排序:
    // 将当前数插入到已有的数组中,使之有序:
    // j从i+1开始往前直到找到一个比他大(小)的数为止,一直交换
    @Test
    public void test(){
        int[] a = {1,2,5,8,3,4,6,9,7};
        sort(a);
        System.out.println(Arrays.toString(a));
    }
    public void sort(int[] a){
        for(int i=0; i<a.length-1; i++){
            for(int j=i+1; j>0; j--){
                if(a[j] < a[j-1]){
                    a[j] += a[j-1];
                    a[j-1] = a[j] - a[j-1];
                    a[j] -= a[j-1];
                }else{
                    break;
                }
            }
        }
    }
}

 

当使用多步长时变为希尔排序:

public void xierSort(int[] a){
        int h=1;
        // 确定步长
        while(h<a.length/3){
            h = 3*h+1;
        }
        for(;h>=1;h/=3){
            for(int i=0; i<a.length-h; i+=h){
                for(int j=i+h; j>0; j-=h){
                    if(a[j] < a[j-h]){
                        a[j] += a[j-h];
                        a[j-h] = a[j] - a[j-h];
                        a[j] -= a[j-h];
                    }else{
                        break;
                    }
                }
            }
        }
    }

 

posted @ 2021-05-05 14:37  wsZzz1997  阅读(49)  评论(0编辑  收藏  举报