直接插入排序

2021-09-12 08:19:41 字數 1531 閱讀 9427

插入排序演算法思想:每趟將乙個元素,按照其關鍵字的大小插入到它前面已經排序的子串行中,依此重複,直到插入全部元素。

插入排序包括:直接插入排序、二分插入排序以及希爾排序。

1.基本思想

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

2.第 i-1 趟直接插入排序

通常將乙個記錄 r[i][i=2,3,…,n-1]插入到當前的有序區,使得插入後仍保證該區間裡的記錄是按關鍵字有序的操作稱第 i-1 趟直接插入排序。

排序過程的某一中間時刻,r 被劃分成兩個子區間 r[1..i-1](已排好序的有序區)和 r[i..n](當前未排序的部分,可稱無序區)。

直接插入排序的基本操作是將當前無序區的第 1 個記錄 r[i]插人到有序區 r[1..i-1]中適當的位置上,使 r[1..i]變為新的有序區。因為這種方法每次使有序區增加1個記錄,通常稱增量法。

插入排序與打撲克時整理手上的牌非常類似。摸來的第 1 張牌無須整理,此後每次從桌上的牌(無序區)中摸最上面的 1 張並插入左手的牌(有序區)中正確的位置上。為了找到這個正確的位置,須自左向右(或自右向左)將摸來的牌與左手中已有的牌逐一比較。

1.簡單方法

首先在當前有序區 r[1..i-1]中查詢r[i]的正確插入位置 k(1≤k≤i-1);然後將 r[k..i-1]中的記錄均後移乙個位置,騰出 k 位置上的空間插入 r[i]。

注意: 若 r[i]的關鍵字大於等於 r[1..i-1]中所有記錄的關鍵字,則 r[i]就是插入原位置。

2.改進的方法

一種查詢比較操作和記錄移動操作交替地進行的方法。

具體做法:

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

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

public void insert(int a)

; for (int i = 1; i < a.length; i++)

// left即為找到的要插入的位置,所以下邊的迴圈將left-(i-1)位置的元素依次向後移動

for (int j = i-1; j>=left; j--)

a[left] = temp; // 將temp插入到left位置

} for (int i : a)

}

折半查詢比順序查詢快,所以折半插入排序就平均效能來說比直接插入排序要快,它所需要的關鍵碼比較次數與待排序記錄的初始排列無關,僅依賴與記錄個數,比較次數約等於nlogn次。

當n較大時,總關鍵碼比較次數比直接插入比較次數的最壞情況(n平方)/4要好很多,但比其最好情況2(n-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...

直接插入排序

源文章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起直至...