Java算法實現-直接插入排序

直接插入排序

定義:
有一個已經有序的數據序列,要求在這個已經排好的數據序列中插入一個數,但要求插入後此數據序列仍然有序,這個時候就要用到一種新的排序方法——插入排序法,
插入排序的基本操作就是將一個數據插入到已經排好序的有序數據中,從而得到一個新的、個數加一的有序數據,算法適用於少量數據的排序,時間複雜度爲O(n^2)。是穩定的排序方法。插入算法把要排序的數組分成兩部分:
第一部分包含了這個數組的所有元素,但將最後一個元素除外(讓數組多一個空間纔有插入的位置),而第二部分就只包含這一個元素(即待插入元素)。在第一部分排序完成後,再將這個最後元素插入到已排好序的第一部分中。

插入排序的基本思想是:
每步將一個待排序的紀錄,按其關鍵碼值的大小插入前面已經排序的文件中適當位置上,直到全部插入完爲止。 —–來自百度詞條

當然了英文毫無壓力的兄弟可以參考一下這裏:
https://en.wikipedia.org/wiki/Insertion_sort

個人覺得首先不去考慮一個算法的時間複雜度與空間複雜度,單從應用場景上會讓人更好理解

比如大家都有在學校課間操按身高(暫且默認升序)排成一列的經歷,通常是後一個同學C與前一個同學B做比較,如果B的身高>C的身高,則前一個同學B的位置後移,否則保持位置不變; 之後C同學繼續與前面的同學A的身高做比較,執行內部循環;

假設現在給定一個數組{171,163,178,184,172,168,190,175,161,160,185} 代表學生的身高

JAVA實現插入排序:

    public static int[] insertSort(int[] arrays) {
        int back;                                 //標記位
        for (int i = 1; i < arrays.length; i++) { //從第二個同學開始
            back = arrays[i];                     //記錄當前同學(的身高)
            for (int j = i - 1; j >= 0; j--) {    //內部循環,依次與前一名同學做身高比較
                if (arrays[j] > back) {           //如果前一名同學的身高大於當前同學的身高
                    arrays[j + 1] = arrays[j];    //前一名同學後移一位
                } else {
                    break;                        //
                }
                arrays[j] = back;                 //後一名同學(也就是當前同學)移動至前一位
            }
        }
        return arrays;
    }
    public static void main(String[] args) {
        int[] arrays ={171,163,178,184,172,168,190,175,161,160,185} ;
        int[] insertSort = insertSort(arrays);
        for (int i = 0; i < insertSort.length; i++) {
            System.out.println(insertSort[i]);
        }
    }

打印結果:
160
161
163
168
171
172
175
178
184
185
190

再補充一個例子: 比如某個同學遲到進隊

    public static int[] insertSort(int[] arrays, int x) {
        int[] newArarrys = new int[arrays.length + 1];
        newArarrys[newArarrys.length - 1] = x;
        System.arraycopy(arrays, 0, newArarrys, 0, arrays.length);
        int back;
        for (int i = 1; i < newArarrys.length; i++) {
            back = newArarrys[i];
            for (int j = i - 1; j >= 0; j--) {
                if (newArarrys[j] > back) {
                    newArarrys[j + 1] = newArarrys[j];
                } else {
                    break;
                }
                newArarrys[j] = back; 
            }
        }
        return newArarrys;
    }

運行:

public static void main(String[] args) {
        int[] arrays ={171,163,178,184,172,168,190,175,161,160,185} ;
        int[] insertSort = insertSort(arrays,170);
        for (int i = 0; i < insertSort.length; i++) {
            System.out.println(insertSort[i]);
        }
    }

打印結果:
160
161
163
168
170
171
172
175
178
184
185
190


最後在補個動圖:

插入排序gif演示

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