直接插入排序

2021-05-23 22:18:41 字數 1475 閱讀 2684

源文章url:http://student.zjzk.cn/course_ware/data_structure/web/paixu/paixu8.2.1.1.htm

做過部分修改。

1、基本思想

假設待排序的記錄存放在陣列r[1..n]中。初始時,r[1]自成1個有序區,無序區為r[2..n]。從i=2起直至i=n為止,依次將r[i]插入當前的有序區r[1..i-1]中,生成含n個記錄的有序區。

2.具體做法

將待插入記錄r[i]的關鍵字從右向左依次與有序區中記錄r[j](j=i-1,i-2,…,1)的關鍵字進行比較:

① 若r[j]的關鍵字大於r[i]的關鍵字,則將r[j]後移乙個位置;

②若r[j]的關鍵字小於或等於r[i]的關鍵字,則查詢過程結束,j+1即為r[i]的插入位置。

關鍵字比r[i]的關鍵字大的記錄均已後移,所以j+1的位置已經騰空,只要將r[i]直接插入此位置即可完成一趟直接插入排序。

演算法分析

1.演算法的時間效能分析

對於具有n個記錄的檔案,要進行n-1趟排序。

各種狀態下的時間複雜度:

┌─────────┬─────┬──────┬──────┐

│ 初始檔案狀態     │   正序   │     反序   │無序(平均)  │

├─────────┼─────┼──────┼──────┤

│ 第i趟的關鍵      │   1      │     i+1    │ (i-2)/2  │

│ 字比較次數       │          │            │            │

├─────────┼─────┼──────┼──────┤

│總關鍵字比較次數  │   n-1    │(n+2)(n-1)/2│ ≈n2/4     │

├─────────┼─────┼──────┼──────┤

│第i趟記錄移動次數 │   0      │ i+2        │ (i-2)/2  │

├─────────┼─────┼──────┼──────┤

│總的記錄移動次數  │   0      │(n-1)(n+4)/2│ ≈n2/4     │

├─────────┼─────┼──────┼──────┤

│時間複雜度        │  0(n)  │ o(n2)    │ o(n2)    │

└─────────┴─────┴──────┴──────┘

注意:初始檔案按關鍵字遞增有序,簡稱"正序"。

初始檔案按關鍵字遞減有序,簡稱"反序"。 

2.演算法的空間複雜度分析

演算法所需的輔助空間是乙個監視哨,輔助空間複雜度s(n)=o(1)。是乙個就地排序。

3.直接插入排序的穩定性

直接插入排序是穩定的排序方法。

直接插入排序

直接插入排序是一種最簡單的排序方法,它的基本思想是依次將每個記錄插入到乙個有序中去。就是說,第i i 1 遍整理時,a1,a2,ai 1已經是排好序的子串行 取出第i個元素ai,在已排好序的子串行為ai找到乙個合適的位置,並將它插到該位置上。易知上述排序當i 1時實際上為空操作,故可直接從i 2開始...

直接插入排序

直接插入排序的演算法思想 直接插入排序 straight insertion sort 的基本操作是將乙個記錄插入到已經排好序的有序表中,從而得到乙個新的 記錄數增 1 的有序表。根據該思想,編寫 如下 從已有序列的第0個記錄開始比較 public static void insertsort1 i...

直接插入排序

直接插入排序本質上就是我們玩撲克牌的時候整理撲克所做的操作,舉個例子,現在手上有5張牌 4,8,6,7,10 按由大到小的順序來使用直接插入排序演算法排序 先預設最左邊的第一張牌為最小的4,讀取第二張8,因為8大於4,不予理會,再往後看,見到了6,6小於前一位的8,於是 將牌6取出,發現6又大於4,...