經典排序算法(二)--- 直接插入排序

直接插入排序

直接插入排序(Straight Insertion Sort)是一種最簡單的排序方法,其基本操作是將一條記錄插入到已排好的有序表中,從而得到一個新的、記錄數量增1的有序表

算法原理

每次從無序表中取出第一個元素,把它插入到有序表的合適位置,使有序表仍然有序。
第一趟比較前兩個數,然後把第二個數按大小插入到有序表中; 第二趟把第三個數據與前兩個數從後向前掃描,把第三個數按大小插入到有序表中;依次進行下去,進行了(n-1)趟掃描以後就完成了整個排序過程

複雜度及穩定性
平均時間複雜度 最優時間複雜度 最壞時間複雜度 空間複雜度 穩定性
O(N^2) O(N) O(N^2) O(1) 穩定
動畫演示

在這裏插入圖片描述

視頻演示

在這裏插入圖片描述

代碼實現
  1. python

    # 利用Python list的insert方法,如果需要倒序,只需將array[j] >= current改爲小於即可
    def insert_sort(array):
        for i in range(1, len(array)):
            current = array[i]
            for j in range(i):
                if array[j] >= current:
                    array.insert(j, current)
                    array.pop(i+1)
                    break
        return array
     # 直接移動元素的方法,如果需要倒序,只需將array[pre_index] > current 改爲小於即可
     def insert_sort2(array):
        for i in range(1, len(array)):
            pre_index = i-1
            current = array[i]
            while pre_index >= 0 and array[pre_index] > current:
                array[pre_index+1] = array[pre_index]
                pre_index -= 1
            array[pre_index+1] = current
        return array
    print(insert_sort([2, 4,3,10,9, 1, 8, 5, 5]))
    print(insert_sort2([2, 4,3,10,9, 1, 8, 5, 5]))
    # [1, 2, 3, 4, 5, 5, 8, 9, 10]
    
  2. java

    static int[] insertSort(int[] listData){
        for(int i=1;i< listData.length; i++){
            int current = listData[i];
            int j = i - 1;
            while (j >= 0 && current <=listData[j]){
                listData[j+1] = listData[j];
                j --;
            }
            listData[j+1] = current;
        }
        return listData;
    }
    // 查看輸出,如果需要倒序,則將current <=listData[j]改爲大於即可
    public static void main(String[] args) {
        int[] test = insertSort(new int[]{2, 4,3,10,9, 1, 8, 5, 5});
        for (int i: test) {
            System.out.println(i);
        }
    }
    // [1, 2, 3, 4, 5, 5, 8, 9, 10]
    
算法優化

直接插入排序還有一種改進算法,叫做折半插入排序,比直接插入算法明顯減少了關鍵字之間比較的次數,因此速度比直接插入排序算法快,但記錄移動的次數沒有變,所以折半插入排序算法的時間複雜度仍然爲O(n^2),與直接插入排序算法相同 。首先找好待排元素在已排好序列表中的插入位置,然後移動元素插入。

  1. python

    # 利用insert的方法,反序將array[middle] > current改爲小於
    def insert_sort(array):
        for i in range(0, len(array)):
            current = array[i]
            low = 0
            high = i
            while low <= high:
                middle = (low + high) // 2
                if array[middle] > current:
                    high = middle - 1
                else:
                    low = middle + 1
            array.insert(low, current)
            array.pop(i+1)
        return array
    # 直接移動的方法,反序將array[middle] > current改爲小於
    def insert_sort2(array):
        for i in range(0, len(array)):
            pre_index = i-1
            current = array[i]
            low = 0
            high = i
            while low <= high:
                middle = (low + high) // 2
                if array[middle] > current:
                    high = middle - 1
                else:
                    low = middle + 1
            for j in range(low, i):
                array[pre_index+1] = array[pre_index]
                pre_index -= 1
            array[pre_index + 1] = current
        return array
    print(insert_sort([2, 4,3,10,9, 1, 8, 5, 5]))
    print(insert_sort2([2, 4,3,10,9, 1, 8, 5, 5]))
    # [1, 2, 3, 4, 5, 5, 8, 9, 10]
    
  2. java

    static int[] insertSort(int[] listData){
        for(int i=1;i< listData.length; i++) {
            int current = listData[i];
            int low = 0;
            int high = i;
            int pre_index = i - 1;
            while (low <= high){
                int middle = (low + high) / 2;
                if (listData[middle] > current){
                    high = middle -1;
                }else {
                    low = middle + 1;
                }
            }
            for(int j = low; j< i;j++){
                listData[pre_index +1] = listData[pre_index];
                pre_index -= 1;
            }
            listData[pre_index+1] = current;
        }
            return listData;
    }
    // 查看輸出,反序將listData[middle] > current改爲小於
    public static void main(String[] args) {
        int[] test = insertSort(new int[]{2, 4,3,10,9, 1, 8, 5, 5});
        for (int i: test) {
            System.out.println(i);
        }
    }	
    
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章