算法-插入排序

算 法:插入排序算法
時間復雜度:O(n^2)

  • 插入排序算法描述
  • 插入排序偽代碼
  • 插入排序?qū)崿F(xiàn)

插入排序算法概述

插入排序的原理是構建有序序列,對于給定的一個無序序列,從前往后遍歷,在該元素之前的序列中從后往前掃描,尋找正確位置,這樣對于每一個正在排序的元素,前面的序列總是有序的,當遍歷完整個序列,即完成排序。《算法導論》給了一個更通俗更容易理解的形象的描述。我們都玩過撲克牌,大多數(shù)人拿撲克牌的時候都有這么個習慣,那就是將撲克牌按照一定的順序排列好,而插入排序就好比你不斷從桌上一堆無序排中拿起最上面的那張,然后放入自己手中已有的牌中,而每一次放的過程你都會按照某個順序?qū)⑦@張新拿到的牌插入正確的位置,這樣你手中的牌一直是有序的,而你抽取牌所在的牌堆是無序的。

算法描述

下面以非降序排序為例:

  1. 從第一個元素開始,該元素視為已經(jīng)被排序;
  2. 取出下一個元素記為key,在前面已排序的有序序列中從后往前掃描;
  3. 如果掃描過程中的元素大于key,將該元素移至下一個位置;
  4. 重復3,直至找到已排序的元素小于或等于key的位置;
  5. key插入到該位置;
  6. 重復2-5,直到整個序列遍歷完即得到一個原地排序好的序列。

執(zhí)行過程圖解

以斜體數(shù)字如 1表示key,以粗體數(shù)字如 ‘1’ 表示已排序序列,為了更直觀,用中括號括起來,普通數(shù)字如‘1’表示未排序亂序序列,簡要表示排序流程如下:

  • 5 2 4 6 1 3
  • [5] 2 4 6 1 3
  • [2 5] 4 6 1 3
  • [2 4 5] 6 1 3
  • [2 4 5 6] 1 3
  • [1 2 4 5 6] 3
  • [1 2 3 4 5 6]

插入排序偽代碼

(偽代碼引用《算法導論》給出的例子)
INSERTION-SORT(A)

for j = 2 to A.length
  key = A[j]
  // Insert A[j] into the sorted sequence A[1..j - 1].
  i = j - 1
  while i > 0 and A[i] > key
    A[i + 1] = A[i]
    i = i - 1
  A[i + 1] = key

插入排序?qū)崿F(xiàn)

為了更直觀,我們將所有元素從1號元素開始計數(shù),將0號元素視為無窮小,即數(shù)組長度為arrLength + 1,序列存儲于arr[1..arrLength]

C

void insertionSort(arrType* arr, int arrLength)
{
  int i, j;
  arrType key;

  for (j = 2; j <= arrLength; j++) {
    key = arr[j];

    i = j - 1;
    while (i > 0 && arr[i] > key) {
      arr[i + 1] = arr[i];
      i--;
    }
    arr[i + 1] = key;
  }
}

Pascal

procedure insertsort;   
var
  i,j,key:integer;
begin
  arr[0] := -maxint;
  for j := 2 to n do
  begin
    i := j - 1;
    key := arr[j];
    while arr[i] > key do
    begin
      arr[i + 1] := arr[i];
      i := i - 1;
    end;
    arr[i + 1] := key;
  end;
end;  

參考資料

本文首發(fā)于個人博客算法 - 插入排序 | 不存在的貓, 轉(zhuǎn)載請注明出處

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • 冒泡排序插入排序插入排序和冒泡排序分析 冒泡排序 冒泡排序(英語:Bubble Sort,臺灣另外一種譯名為:泡沫...
    六尺帳篷閱讀 2,328評論 0 9
  • 插入排序?qū)τ谏倭吭氐呐判蚴呛芨咝У模疫@個排序的手法在每個人生活中也是有的哦。你可能沒有意識到,當你打牌的時候...
    周小春閱讀 481評論 0 0
  • 概述 排序有內(nèi)部排序和外部排序,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進行排序,而外部排序是因排序的數(shù)據(jù)很大,一次不能容納全部...
    蟻前閱讀 5,298評論 0 52
  • 概述:排序有內(nèi)部排序和外部排序,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進行排序,而外部排序是因排序的數(shù)據(jù)很大,一次不能容納全部...
    每天刷兩次牙閱讀 3,822評論 0 15
  • 在我們做一件事情之前,我們或許會考慮結果與后果,然后諸多擔心,此時不但不能全心全意地去做,還會影響正常水平的發(fā)揮,...
    會飛的船閱讀 997評論 0 0

友情鏈接更多精彩內(nèi)容