【一塊兒學習排序算法】4 插入排序

本系列的文章列表和相關說明,請查看序言。具體列表以下:
【一塊兒學習排序算法】0 序言
【一塊兒學習排序算法】1 算法特性及大O記法
【一塊兒學習排序算法】2 冒泡排序
【一塊兒學習排序算法】3 選擇排序javascript

也能夠直接到github上查看完整的文章和源碼!html

本篇爲此係列第四篇。java

插入排序 Insertion sort

原理

先看看Wikipedia的定義:git

Insertion sort algorithm iterates, consuming one input element each repetition, and growing a sorted output list. Each iteration removes one element from the input data, finds the location it belongs within the sorted list, and inserts it there. It repeats until no input elements remain.github

因此插入排序的思路就是:算法

  • 把列表分爲兩個部分,一部分是已經排好序,一部分待排序。(這一點和選擇排序相似)
  • 初始將第一個元素做爲有序子列爲,而後每次迭代從有序序列中移除;而後將它插入到有序序列中的相應位置。
  • 重複以上步驟,直到到最後一個元素,則表示數組有序。

圖示

能夠經過動畫演示理解, 如下網上找的兩個動畫。若是你想操做不一樣的參數來演示,能夠上這個網站visualgo.net動手試試。數組

圖示1

圖示2

代碼實現

關於代碼,README中代碼只有實現算法的函數,具體運行的代碼,請查看該目錄下的文件。bash

代碼以下:數據結構

const insertSort = (array) => {
    // 不修改原數組
    const originValues = array.slice(); 

    // 初始將第一個元素指定爲有序子列,從第2個元素開始插入,直到n-1元素 
    for (let i = 1; i < originValues.length; i++) {
        const currentValue = originValues[i];
        // 標記插入有序子列的位置
        let insertIndex = i;
        // 將當前元素從右到左與有序子列元素比較
        // 起始位置爲當前元素前一個元素,即i-1,終止位置爲0
        // 若是當前元素比該有序子列元素小,則該元素後移一位,並修改插入位置的遊標
        for (let j = i-1; j > -1 && currentValue < originValues[j]; j--) {
           originValues[j+1] = originValues[j];
           insertIndex = j;
        }
        // 插入指定位置
        originValues[insertIndex] = currentValue;
    }

    return originValues;
};
複製代碼

以上就是直接插入排序的代碼實現。整體來講仍是比較簡單易懂,其實就相似於打撲克,不斷將撲克牌按順序插入指定位置。惟一可能有一點容易想不清楚的,就是有序子列的右移部分。想清楚一點,只要有序子列的該元素大於要插入的元素,該元素就要後移一位。ide

算法分析

1. 時間複雜度
排序算法中,兩個元素的比較次數是影響運行時間的首要因素。因此咱們能夠經過這個層面來評估。
最優複雜度
當數組有序時,每一次迭代只有一次比較,因此總共有n-1次比較,複雜度爲O(n)。
最差複雜度
當數組逆序時,每一次都要比較整個有序子列,比較次數爲:

T(n) = 1 + 2 + ... + n-1 = n*n/2
複製代碼

因此,最差複雜度是O(n2)。

2. 穩定性
由於比較元素是,相同值不會交換,因此插入算法是穩定的。

總結

本章節介紹了插入排序的實現。插入排序在思路上,和選擇排序仍是有些相似的。插入排序的複雜度仍是沒有突破O(n2)。
不過,上面的實現只是簡單的插入排序,還能夠優化。就是在有序子列中找插入位置時,利用二叉查找的方法,這樣複雜度能夠到O(nlogn)。這裏先不作介紹。

參考

[1] 動畫演示
[2] tutorials point 教程
[3] Sorting Algorithms
[4] 凱耐基梅隆大學數據結構與算法-排序算法

相關文章
相關標籤/搜索