內部排序 直接插入排序

2021-08-01 22:58:51 字數 1048 閱讀 1840

直接插入排序是一種簡單的排序方法,具體做法是:在插入第i個記錄時,r1、r2…ri-1已經排好序,這時候將ri的關鍵字ki依次與關鍵字ki-1、ki-2等進行比較,從而找到應該插入的位置並將ri插入,插入位置及其後的記錄依次向後移動。

直接插入排序法在最好的情況下(待排序列已按照關鍵碼有序)每趟排序只需要做1次比較而且不需要移動元素,因此n個元素排序時的總比較次數為n-1次,總的移動次數為0次。在最壞的情況下(元素已經逆序排序),在進行第j趟排序時,待插入的記錄需要和前面的每個記錄進行比較,比較次數為j(設定監視哨時,包括與監視哨的一次比較)或j-1(不設定監視哨),移動次數為j+1。 直接插入排序時一種穩定的排序演算法,時間複雜度為o(n2)。在排序過程中僅需要乙個元輔助空間,空間複雜度為o(1)。

/// /// 直接插入排序 不帶哨兵排序 

/// 思想:預設認為第乙個是有序的,從待排序的陣列中依次取乙個元素和已排序的比較

///

/// 待排序陣列

///

private int insertsort(int arrdata)

arrdata[j]=arrdata[0];

}}

return arrdata;

}

帶哨兵的插入排序中的哨兵元素有兩個作用:

1、暫時存放待插入的元素

2、防止陣列下標越界,當待插入的元素小於已排序的子陣列中的最小元素時,j=-1,越界,而採用哨兵,arrdata[0] < arrdata[j],當j=0時,就結束迴圈,不會出現越界(for迴圈只有一次判斷,提高了效率)。

但是帶哨兵的插入排序存在乙個問題:

有方法傳進來的陣列時原始陣列,則插入第乙個元素時,a[0]會被覆蓋,造成最終排完序的陣列缺少了原始陣列的第乙個元素(bug)。

如何消除此bug:

1、在呼叫此方法之前,將陣列做下處理,使其右移乙個元素的位置,空出來的第0個元素初始化為0(或不做初始化)

2、在呼叫方法時,做上述處理

無哨兵的插入排序,無上述問題,但在效率上會稍低,for迴圈中有兩個判斷條件。

插入排序 直接插入排序

直接插入排序演算法思想 將整個資料表分成左右兩個子表,其中左子表為有序表,右子表為無序表 整個排序過程就是將右子表中的元素逐個插入到左子表中,直到右子表為空,而左子表成為新的有序表。演算法過程分析 將待排序的元素存放在陣列r n 1 中,在初始狀態下,r 0 為監視哨,r 1 為有序區,r 2 r ...

插入排序 直接插入排序

一.插入排序的基本思想 將乙個記錄插入已排序好的有序表中,從而得到乙個新的記錄數加1的有序表。要點 設立哨兵,作為臨時儲存和判斷陣列邊界之用。所謂的哨兵,就是即將插入的記錄。二.示例 如果碰見相等的元素,會被插到後面,所以,相等元素的前後順序沒有改變,插入排序是穩定的。三.演算法實現 public ...

插入排序 直接插入排序

直接插入排序的基本思想 將乙個記錄插入到已排序好的有序表中,然後得到乙個新記錄數增1的有序表。也就是 先將序列的第1個記錄看成是乙個有序的子串行,然後從第2個記錄逐個進行插入,直至整個序列有序為止。如果碰見乙個和插入元素相等的,那麼插入元素把想插入的元素放在相等元素的後面。所以,相等元素的前後順序沒...