排序算法:直接插入排序

Sorting Algorithms:Straight Insertion Sort

前言

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

基本思路

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

動圖示例

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/app

相關文章
相關標籤/搜索