數據結構——排序(插入+希爾)

一:插入排序

基本介紹:

插入排序:對想要排序的序列以插入的方式尋找該元素適當的位置,以達到排序的目的。

基本思想:

把n個待排序的元素看成一個有序表和一個無序表,開始時有序表中只有一個元素,無序表中包含n-1個元素。那麼排序的過程就是每次從無序表中取出第一個元素,把它的排序碼依次與有序表中的有序碼進行比較,將它插入到有序表中的適當位置,使其成爲新的有序表。

代碼:

 public static void InsertSort(int[] array){

        for (int i = 1;i<array.length;i++){

            int insertVal = array[i];   //要插入的數據
            int insertIndex = i-1;  //從要插入的數據的前一個下標的數據進行比較

            while (insertIndex>=0&&array[insertIndex]>insertVal){
                array[insertIndex+1] = array[insertIndex];
                insertIndex--;
            }

            if (insertIndex+1!=i){
                array[insertIndex+1] = insertVal;
            }
        }
        System.out.println(Arrays.toString(array));

    }

希爾排序

簡單插入排序存在問題:
數組:{2,3,4,5,6,1},這時需要插入的數1是最小的,那麼插入過程是:
{2,3,4,5,6,6}
{2,3,4,5,5,6}
{2,3,4,4,5,6}
{2,3,3,4,5,6}
{2,2,3,4,5,6}
{1,2,3,4,5,6}
通過以上案例不難發現:當需要插入的數據是較小的數據,後移次數明顯增多,對效率有很大的影響。因此引入希爾排序

一:希爾排序

基本介紹:

希爾排序是希爾於1959年提出的一種排序算法。希爾排序也是一種插入排序,它是將簡單插入排序算法經過改進的一個更高效的版本,也稱爲縮小增量排序

基本思想:

希爾排序是把記錄按下標的一定增量分組,對每組使用直接插入排序算法進行排序,隨着增量逐漸減少,每組包含的關鍵詞越來越少,當增量減至1的時候,整個文件就恰好被分成一組,算法便終止。

示意圖:

在這裏插入圖片描述
在這裏插入圖片描述

代碼

希爾排序有兩種方法:交換法,移動法。交換法的排序速度要遠小於移動法

** 採用交換法:**

 public static void shellSorted(int[] array){

        int temp;
        for (int gap = array.length/2;gap>0;gap /=2){
            for (int i = gap;i<array.length;i++){
                for (int j = i-gap;j>=0;j-=gap){
                    if (array[j+gap]<array[j]){
                        temp = array[j];
                        array[j] = array[j+gap];
                        array[j+gap] = temp;
                    }
                }
            }
           System.out.println(Arrays.toString(array));
        }
   }

移動法:

  public static void shellSorted2(int[] array){
        //分組
        for (int gap = array.length/2;gap>0;gap /=2){

            for (int i=gap;i<array.length;i++){
                //插入法
                int insertIndex = i;
                int insertVal = array[i];
                if (array[insertIndex]<array[insertIndex-gap]){
                    while (insertIndex-gap  >=0&&insertVal<array[insertIndex-gap]){
                        array[insertIndex] = array[insertIndex-gap];
                        insertIndex-=gap;
                    }
                    array[insertIndex] = insertVal;
                }
            }
        }
        System.out.println(Arrays.toString(array));
    }

在使用移動法實現希爾排序的時候,是使用到了插入排序算法

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