排序演算法:直接插入排序

ZealotZZZ發表於2018-07-18

Sorting Algorithms:Straight Insertion Sort

前言

該部落格用於本弱雞複習鞏固,打牢基礎,還望各大佬不吝賜教。

基本思路

顧名思義,就是把一個新的元素插入已排好序的陣列形成一個新的已排好序的陣列
從第一個元素開始,取下一個元素比較後實現排序,形成新的陣列,
再取第三個元素與該陣列比較,
比較時從該陣列的最後一位開始比較,
若新元素比與其比較的元素小,則將該比較的元素後移以為,
直到新元素比該陣列左邊找到其應該插入的位置。

動圖示例

Insertion Sort
Insertion Sort

演算法複雜度分析

平均 最壞 最好 穩定性 空間複雜度
O(n^2) O(n^2) O(n) 穩定 O(1)

p.s. 平均比較和移動次數約為 (n^2)/4,直接插入排序時簡單排序中效能最好的,better than Selection & Bubble.

程式碼實現

import java.util.Arrays;
import java.util.Random;

/**
 * Straight Insertion Sort
 * 顧名思義,就是把一個新的元素插入已排好序的陣列形成一個新的已排好序的陣列
 * 從第一個元素開始,取下一個元素比較後實現排序,形成新的陣列,
 * 再取第三個元素與該陣列比較,
 * 比較時從該陣列的最後一位開始比較,
 * 若新元素比與其比較的元素小,則將該比較的元素後移以為,
 * 直到新元素比該陣列左邊找到其應該插入的位置
 * <p>
 * 演算法複雜度分析
 * 時間複雜度(平均)   O(n^2) 外迴圈n次,內迴圈m次 m*n
 * 時間複雜度(最壞)   O(n^2) 外迴圈n次,內迴圈m次 m*n
 * 時間複雜度(最好)   O(n) ,陣列已經排好序的情況,即當所有a[i] > a[i-1] 時不需要再執行內迴圈
 * 空間複雜度           O(1)
 * 穩定性             穩定
 * <p>
 * 平均比較和移動次數約為 (n^2)/4
 * 直接插入排序時簡單排序中效能最好的
 * better than Selection & Bubble
 *
 * @author Wayne Zhang
 * @date 2018/07/14
 */

public class InsertionSort {

    public static void main(String[] args) {
        int[] a = new int[10];
        //random array
        for (int i = 0; i < a.length; i++) {
            Random rd = new Random();
            a[i] = rd.nextInt(10);
        }

        System.out.println("Random Array :");
        System.out.println(Arrays.toString(a));
        System.out.println();
        System.out.println("Insertion Sort :");

        //插入排序
        /*for(int i = 1;i<a.length;i++){
            int key = a[i];
            int index = i;
            for(int j = i-1 ;j>=0;j--){
                if(key<a[j]){

                    a[j+1]=a[j];
                    index = j;
                }
            }

            a[index] = key;
        }*/

        //插入排序
        //外迴圈規定從第二個元素開始,將元素插入到已排好的陣列中
        for (int i = 1; i < a.length; i++) {
            //用key來表示插入的元素,若直接用a[i]表示,a[j+1]操作會更改a[i]的值
            int key = a[i];
            //j表示從已排好序的陣列的最右邊開始比較
            int j = i - 1;
            while (j >= 0 && key < a[j]) {
                //若插入的元素小,則將被比較的元素後移一位
                a[j + 1] = a[j];
                j--;
            }
            //此時的a[j]代表著被插入元素左邊相鄰的那個元素
            a[j + 1] = key;
        }


        System.out.println(Arrays.toString(a));
    }
}
複製程式碼

參考

GeekforGeeks: https://www.geeksforgeeks.org/insertion-sort/

十大經典排序演算法:https://www.cnblogs.com/onepixel/articles/7674659.html

《大話資料結構》:https://book.douban.com/subject/6424904/

相關文章