排序演算法之一 直接插入排序

2021-07-22 19:22:57 字數 894 閱讀 5104

直接插入排序中加入了附加記錄,又稱監視哨或者哨兵。

哨兵的主要作用:

① 進人查詢(插入位置)迴圈之前,它儲存了r[i]的副本,使不致於因記錄後移而丟失r[i]的內容;

② 它的主要作用是:在查詢迴圈中監視下標變數j是否越界。一旦越界(即j=0),因為r[0].可以和自己比較,迴圈判定條件不成立使得查詢迴圈結束,從而避免了在該迴圈內的每一次均要檢測j是否越界(即省略了迴圈判定條件j>=1)。

下面的c函式,是基礎的直接插入排序,但是更容易幫助理解哨兵的意思

void insert_sort(int a,int n)

//待排序元素用乙個陣列

a表示,陣列有

n個元素

a[j+1]=temp;//元素後移後要插入的位置就空出了,找到該位置插入 }

}上面的temp就相當於哨兵的意思

下面是改進版的演算法:

void lnsertsort(seqlist r)

while(r[0].key

r[j+1]=r[0];                            //r[i]插入到正確的位置上

}//endif}

演算法用c語言實現了,現在來分析一下時間複雜度和空間複雜度

從空間上:

只需要乙個哨兵來輔助,因此空間複雜度為o(1)

從時間上:

最好的情況:所有的序列本來就是是需要的序列(順序或者逆序),但還是需要遍歷一遍所有元素,那個器時間複雜度為o(n)

最壞的情況:所有的序列和需要的序列恰恰相反,需要(1,2,3,4,5),原序列是(5,4,3,2,1),那就需要在遍歷每乙個元素的時候,要進行一波與前面元素的交換,此時的時間複雜度為2+3+4+...+n 其時間複雜度為o(n2)

一般情況:排序記錄是隨機的,

穩定性:穩定的

基本演算法之一 直接插入排序

package com.wang.demo 插入排序 基本思想 每步將乙個待排序的記錄,從後到前為這個元素找到乙個合適的位置 author xiaoezi public class insertsort system.out.println paixu int mm sortarray arr fo...

排序 一 直接插入排序

1 直接插入排序 1 定義 直接插入排序 straight insertion sort 是一種最簡單的排序方法。它的基本操作是將乙個記錄插入到乙個長度為m 假設 的有序表中,使之仍保持有序,從而得到乙個新的長度為m 1 的有序表。2 演算法思路 設有一組關鍵字 k 1 k 2 k n 排序開始就認...

排序一 直接插入排序

基本思想 當插入第i i 1 個物件時,前面的i 1 項 元素已經排序完成,這時 用 第 i 項 和 前面的 i 1 項進行比較,然後把插入的位置後面的元素後移一位 再 插入該位置。實現一趟排序的步驟 找位置 移位 插入資料 實現 void insertsort int arr size t siz...