最近在和小夥伴們一起研究排序,排序分好多總,後期會做整體總結,本篇則主要對插入排序進行乙個整理。
插入排序(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 的作法是 每次從無序表中取出第乙個元素,把它插入到有序表的合適位置,使有序表仍然有序。第一趟比較前兩個數,然後把第二個數按大小插入到有序表中 第二趟把第三個資料與前兩個...