數據結構與算法_插入排序

我是野豬。

排序: 將雜亂無章的數據元素,通過一定的方法按關鍵字順序排列的過程叫做排序。對數據進行排序有可能是檢索的一個初始步驟。二分查找比線性查找要快的多,然而它只能應用於有序的數據。其次排序非常重要也可能非常耗時。


冒泡排序、選擇排序和插入排序都是簡單排序,算法時間複雜度都是O(n^2)。

插入排序:每一步都將一個待排的數據按其大小插入到已經排序的數據中的適當位置,直到全部插入完畢。


java代碼:

/**
 * 插入排序
 * 插入排序的時間複雜度分析:
 * 比較次數是1+....+N-1 比較次數爲O(N方) 也就是說冒泡 選擇 插入排序的比較都是O(N方)
 * 冒泡交換的次數是O(N 方) 選擇交換的次數是O(N)
 * 那麼插入排序的好處在哪呢?
 *
 */

public class InsertSort {
    public static void main(String[] args) {
        int sore[] = {3, 1, 4, 63};

        for (int i = 1; i < sore.length; i++) {//第一次是把首位的元素當成一個有序 從i=1開始與之比較
            int temp = sore[i];//待排序的元素
            int insertLocation = i - 1;//與 temp(待排序元素的) 比較的數值下標

            while (insertLocation >= 0 && sore[insertLocation] > temp) {
                sore[insertLocation + 1] = sore[insertLocation];//後移一位
                insertLocation--;//接着和前一位比較 直到隊頭insertLocation = 0
            }

            sore[insertLocation + 1] = temp;//至於要不要+1,可以簡單的這樣想:2個元素[3,1]時,跳出while循環是insertLocation=-1

        }

        System.out.println("直接插入排序(從小到大):");
        for (int i : sore) {
            System.out.println(i + "");
        }
    }
}
插入排序:

首先,對於小規模的文件以及基本有序的文件,插入排序能比快排更爲有效。一般情況下,它比冒泡排序快一倍,比選擇排序還要快一點,而且經常被用在較複雜的排序算法的最後階段,比如快速排序。
其次,對於已經有序或者基本有序的數據來說,插入排序要好得多。當數據有序的時候,while循環的條件總是假,所以它變成了外層循環中國的一個簡單語句,執行N-1次。這種情況下,算法運行只需要O(N)的時間。也就是說如果數據基本有序,插入排序幾乎只需要O(N)的時間,但是,對於逆序排列的數據,每次比較和移動都會執行,所以插入排序不比冒泡排序快。

對簡單排序,冒泡排序、選擇排序和插入排序做一個簡單的總結:

簡單排序所有的算法時間複雜度都是O(N^2)。不過某些情況下某個算法可以比其他算法快很多。
冒泡排序:冒泡排序是效率最差的算法,但他最簡單。一般情況下不太使用,當數據量很小的時候會有些應用的價值。
選擇排序:把交換次數降到最低,但比較的次數仍然很大。當數據量很小,並且交換數據相對於比較數據更加耗時的情況下,可以應用選擇排序。
插入排序:在大多數情況下,假設當數據量比較小或基本上有序時,插入排序算法是三種簡單排序算法中的最好的選擇。對於更大數據量的排序來說,快排則是最快的方法。


補充:另一個衡量算法的標準是需要的內存空間有多大。簡單排序都是除了初始數組外幾乎不需要其他內存空間。

如有問題,請及時指出。

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