交換式希爾排序(Java實現)

在之前的插入排序做了一下優化,當一個比較小的數比較靠後時,進行移動的次數必然要增多,所以使用希爾排序進行改進。

實現原理:將一個待排序的數組分成arr.length/2組,步長移動爲arr.length/2,將一組內的數字比較的大小,大的放在後面,小的放在前面。進行一輪排序之後,再繼續將排序後的數組分爲arr.length/2/2 組,步長爲arr.length/2/2,從第一個數開始移動arr.length/2/2步,進行比較,同樣小的放在前面,大的放後面,依次比較,就能得到一個有序數組。

舉例:定義數組 int arr[] = {8,9,1,7,2,3,5,4,6,0};
上面的數組共有10個數據,首先將他們分成10/2 = 5組,從第一個數字開始,步長爲10/2步,按照這樣來進行分組,分組之後就是 [8,3][9,5][1,4][7,6][2,0],再將他們分別在組內比較,比如8和3比較,3<8,將3與8的位置交換,之後的依次比較,小的放前面,大的放後面。這樣一組比較完之後,得到的新數組就是[3, 5, 1, 6, 0, 8, 9, 4, 7, 2],再將得到的數組再進行分組,分成5/2=2組,從第一個數開始移動步長爲2,分成的組是[3,1,0,9,7] [5,6,8,4,2]在組內分別使用,直接插入排序進行比較。經過兩輪比較之後得到一個比較有序的數組。在進行最後一次比較,分成1組,從第一個開始,步長爲1,進行比較,比較完畢 數組是[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

代碼實現

package cn.mrlij.sort;

import java.util.Arrays;

/**
 * 交換式希爾排序
 * 實現原理:將一個待排序的數組分成arr.length/2組,步長移動爲arr.length/2,將一組內的數字比較的大小,
 *          大的放在後面,小的放在前面。進行一輪排序之後,再繼續將排序後的數組分爲arr.length/2/2 組,
 *          步長爲arr.length/2/2,從第一個數開始移動arr.length/2/2步,進行比較,同樣小的放在前面,大的放後面
 *
 */
//舉例:定義數組 int arr[] = {8,9,1,7,2,3,5,4,6,0};
    //上面的數組共有10個數據,首先將他們分成10/2 = 5組,從第一個數字開始,步長爲10/2步,按照這樣來進行分組
    //分組之後就是 [8,3][9,5][1,4][7,6][2,0],再將他們分別在組內比較,比如8和3比較,3<8,將3與8的位置交換,
    //之後的依次比較,小的放前面,大的放後面。這樣一組比較完之後,得到的新數組就是[3, 5, 1, 6, 0, 8, 9, 4, 7, 2]
    //再將得到的數組再進行分組,分成5/2=2組,從第一個數開始移動步長爲2,分成的組是[3,1,0,9,7] [5,6,8,4,2]在組內分別使用
    //直接插入排序進行比較。經過兩輪比較之後得到一個比較有序的數組。在進行最後一次比較,分成1組,從第一個開始,步長爲1,進行比較
    //比較完畢 數組是[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
public class ShellSort {
    public static void main(String[] args) {
        int arr[] = {8,9,1,7,2,3,5,4,6,0};

        for(int gap = arr.length/2; gap>0;gap/=2){
            for(int i = gap;i<arr.length;i++){
                for(int j = i-gap;j>=0;j-=gap){

                    if(arr[j]>arr[j+gap]){
                        int temp = arr[j];
                        arr[j] = arr[j+gap];
                        arr[j+gap] = temp;
                    }
                }
            }
        }
//        for(int i = 5;i<arr.length;i++){
//            for(int j = i-5;j>=0;j-=5){
//
//               if(arr[j]>arr[j+5]){
//                   int temp = arr[j];
//                   arr[j] = arr[j+5];
//                   arr[j+5] = temp;
//               }
//            }
//        }
//        System.out.println();
//        System.out.println(Arrays.toString(arr));
//        for(int i = 2;i<arr.length;i++){
//            //分成兩組 [3,1,0,9,7] [5,6,8,4,2]
//            for(int j = i-2;j>=0;j-=2){
//                if(arr[j]>arr[j+2]){
//                    int temp = arr[j];
//                    arr[j] = arr[j+2];
//                    arr[j+2] = temp;
//                }
//            }
//        }
//        System.out.println(Arrays.toString(arr));
//        for(int i = 1;i<arr.length;i++){
//            //分成兩組 [3,1,0,9,7] [5,6,8,4,2]
//            for(int j = i-1;j>=0;j-=1){
//                if(arr[j]>arr[j+1]){
//                    int temp = arr[j];
//                    arr[j] = arr[j+1];
//                    arr[j+1] = temp;
//                }
//            }
//        }
        System.out.println(Arrays.toString(arr));
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章