插入排序:思路與實現

插入排序的思想

插入排序算法是一個比較簡單好理解的算法。直接的例子就是玩撲克的時候,想象一下,分牌的時候,大家輪流的從一組牌中抽取最上面的一張,然後將它以某種順序插入到我們的左手中。比如,我們想要從小到大排列我們的撲克牌。

那麼第一次,抽到了2,我們的左手還沒有任何牌,直接放到左手上。

左手:[2]

第二次,我們抽到了9,由於已經存在2了,因此,我們將9放在2的右邊。

左手:[2, 9]

第三次,我們抽到了1(A),我們會很自然的將它塞進2的左邊。

左手:[1, 2, 9]

以上這個過程如此循環。在這個過程中,不得不佩服人的大腦可以瞬間知道該塞在哪裏。眼睛一瞟,就能快速的知道應該放到哪個位置附近,然後再仔細的查看,稍加比較,就可以得出結果。
但是計算機就不行了,它無法像人眼那樣一下子獲取到全局的信息,它只能一個一個的比較。另一方面,它在插入的時候,操作數據是時候,也不像人類操作撲克那樣的方便。

插入排序的總體思想,我們已經知道了,接下來就是如何實現了。

思路

我們拿到的是一個數組。arr,我們可以假設,第一個數據是排好的,以它作爲基準,從第二個數據開始進行處理。

我們拿第二個數據arr[1]和第一個數據arr[0]進行比較,如果arr[1] >= arr[0],那就沒有什麼需要操作的,它們兩個也是排好的,如果arr[1] < arr[0],那麼,我們就需要將它們交換位置。

考慮一個更通用的情況,比如:

1, 3, 4, 5, 2, 7 // 初始化的情況
0, 1, 2, 3, 4, 5 // 這是index

index=1開始,3大於1,那麼index++
index=2,4大於3,那麼index++
index=3,5大於4,那麼index++
index=4,2小於5,那麼交換5和2的位置,並index--

1, 3, 4, 2, 5, 7 // 交換後
0, 1, 2, 3, 4, 5 // 這是index

index=3,2小於4,繼續交換,index--

1, 3, 2, 4, 5, 7 // 交換後
0, 1, 2, 3, 4, 5 // 這是index

index=2,2小於3,繼續交換,index--

1, 2, 3, 4, 5, 7 // 交換後
0, 1, 2, 3, 4, 5 // 這是index

index=1,2大於1,完事了

???剛剛我處理到哪裏了???

由於沒有保存開始處理的index,導致不知道從哪裏繼續開始。
所以,不斷交換的index和開始處理的index要獨立保存即可

實現

public class InsertSort implements ISort {

    @Override
    public int[] sort(int[] data) {

        if (data == null) {
            return null;
        }

        if (data.length == 1) {
            return data;
        }

        for (int i = 1; i < data.length; i++) {
            int finder = i; // 將當前要處理的index保存住
            int val = data[i];
            while (finder >= 0 && val < data[finder - 1]) {
                data[finder] = data[finder - 1]; // 交換數據
                data[finder - 1] = val;
                finder--; // 繼續和之前的比較
            }
        }

        return data;
    }
}

wiki上標準的寫法

public void insertionSort(int[] array) {
    for (int i = 1; i < array.length; i++) {
        int key = array[i];
        int j = i - 1;
        while (j >= 0 && array[j] > key) {
            array[j + 1] = array[j];
            j--;
        }
        array[j + 1] = key;
    }
}

總得來說,插入排序是思路和實現都比較簡答的排序方法。
最好情況時間複雜度爲:O(n)
最壞和平均情況時間複雜度都是:O(n^2)

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