排序系列 比較排序系列之 直接插入排序

2021-08-21 12:01:49 字數 1538 閱讀 8479

最近在和小夥伴們一起研究排序,排序分好多總,後期會做整體總結,本篇則主要對插入排序進行乙個整理。

插入排序(insert sorting)的演算法思想十分簡單,就是對待排序的記錄逐個進行處理,每個新紀錄與同組那些已排好序的記錄進行比較,然後插入到適當的位置。用三個字總結就是—-「多對一」的關係。

插入排序分好幾種,比如二分插入排序,交換插入排序,直接插入排序,本篇我們重點總結最熟悉的「直接插入排序」。

比如有乙個陣列【45 34 78 12 34』 32 29 64】,我們針對此進行一下講解。

排序過程 陣列

第一遍 45和34比較,34<45,所以排序完成為3445 78 12 34』 32 29 64

第二遍 78和34 45比較 78>45 78>34,所以位置不變,排序完為 34 457812 34』 32 29 64

第三遍 12和34 45 78比較 12<78 左移+1,12<45 左移+2,12<34 左移+3,排序完為1234 45 78 34』 32 29 64

第四遍 34』 左移+2 排序完 12 3434』45 78 32 29 64

第五遍 32 左移+4 排序完 123234 34』 45 78 29 64

第六遍 29 左移+6 排序完 122932 34 34』 45 78 64

第七遍 64 左移+1 排序完 12 29 32 34 34』 456478

用**實現的話其實更簡單,引入乙個臨時變數,具體看**:

public

static

void main(string args) ;

test2.insertsort(array);

system.out.println(arrays.tostring(array));

}void insertsort(int array)

array[j + 1] = temprecord;

}}

2023年07月30日14:30:55補充:

array[j + 1] = temprecord,應該放入while迴圈內,因為若temprecore不小於array[j],則此次i迴圈則直接結束。

通過**我們來看一下時間複雜度和空間複雜度。

因為我們只引入了乙個輔助存放插入記錄的臨時變數,因此空間代價為乙個記錄大小 及o(1);

當資料正序時,如上我們口述的排序比較過程,執行效率最好,每次插入都不用移動前面的元素,有n個元素參與比較,時間複雜度為o(n)。

當資料反序時,則執行效率最差,每次插入都要前面的元素後移,

i=1時,移動2-1;

i=2時,移動3-1;

當i=n時,移動n-1;

求和公式:n(n-1)/2=o(n2)

所以最壞的時間複雜度為o(n2)

排序系列之 直接插入排序

排序 直接插入排序.cpp 定義控制台應用程式的入口點。include stdafx.h include 用於呼叫隨機種子函式 include include include using namespace std 說明 c 實現直接插入排序 直接插入排序思想 如我們打牌一樣,一開始手上一張牌都沒有...

排序系列之直接插入排序

for int i 1 i此為外層迴圈,固定執行n 1次 在指定索引位置插入乙個資料,需要 從資料尾部 開始依次向後移動一位直到到達索引位置 int data l i 用來儲存要插入的資料 for int j i isup l j 1 data isup l j 1 data j 0 j 該邏輯表示...

C 排序系列(一) 插入排序之直接插入排序

鄭重宣告 本文是筆者根據個人理解所寫,錯誤難免,歡迎拍磚!演算法思想 直接插入排序 straight insertion sort 的作法是 每次從無序表中取出第乙個元素,把它插入到有序表的合適位置,使有序表仍然有序。第一趟比較前兩個數,然後把第二個數按大小插入到有序表中 第二趟把第三個資料與前兩個...