插入排序(直接插入排序 折半插入排序和希爾排序)

2021-10-23 07:49:52 字數 2519 閱讀 3055

所謂插入排序就是將乙個待排序的記錄,按其關鍵字大小插入到前面已經排好序的子串行中,直到全部記錄插入完成。

1.直接插入排序

假設在排序過程中,待排序表l[1…n]在某次排序過程中的某一時刻狀態如下:

為了實現將元素l[i]插入到已有序列的子串行l[1…i-1]中,需要執行以下操作:

(1)查詢l(i)在l[1…i-1]中的插入位置。注意是從1到n !!!

(2) 將l[k…i-1]中所有元素全部後移乙個位置。

(3)將l(i)複製到l(k)。

為了實現對l[1…n]的排序,可以將l(2)~l(n)依次插入到前面已排好序的子串行中,初始假定l[1]是乙個已排好序的子串行。執行n-1次插入排序,就能得到乙個有序的表。**如下:

#include

#include

using

namespace std;

void

insertsort

(int a,

int n)

;int

main()

a[0]

=1110

;insertsort

(a, n)

;printf

("請輸出排序好的陣列:\n");

for(

int i=

1; i<=n; i++

)return0;

}void

insertsort

(int a,

int n)

a[j+1]

= a[0]

;//複製到插入位置 }}

}/*void insertsort(int a, int n)

a[j] = temp;

}}

編譯執行的結果如圖所示:

2.折半插入排序

從前面的直接插入排序演算法中,不難看出每趟插入的過程中,都進行了兩項工作:1 從前面的字表中查詢出待插入元素應該被插入的位置; 2 給插入位置騰出空間,將待插入元素複製到表中的插入位置。直接插入排序演算法總是邊比較邊移動元素,下面將比較和移動操作分離出來,即先折半查詢出元素的待插入位置,然後再統一地移動待插入位置之後的所有元素。當排序表為順序儲存的線性表時,可以對直接插入排序演算法作如下改進:

由於是順序儲存的線性表,所以查詢有序子表時可以用折半查詢來實現,在確定出待插入位置後,就可以統一地向後移動元素了。**如下:

#include

#include

using

namespace std;

void

binaryinsertsort

(int a,

int n)

;int

main()

a[0]

=1110

;binaryinsertsort

(a, n)

;printf

("請輸出排序好的陣列:\n");

for(

int i=

1; i<=n; i++

)return0;

}void

binaryinsertsort

(int a,

int n)

for(j = i-

1; j >= high+

1; j--

) a[high +1]

= a[0];}}

3.希爾排序直接插入排序演算法適用於基本有序的排序表和資料量不大的排序表。基於這兩點,d.l.shell提出了希爾排序,又稱為縮小增量排序。

希爾排序的基本思想:先將待排序表分割成若干個形如l[i, i+d, i+2d,…i+kd]的「特殊」字表,分別進行直接插入排序,希爾排序的排序過程如下:

先取乙個小於n的步長d1(d1 = n/2),把表中全部記錄分成d1個組,所有距離為d1的倍數的記錄放在同乙個組,在各組中進行排序;然後取d2(d2 = d1/2),重複上述過程,直到所取到的dn = 1,即所有記錄已放在同一組中,再進行直接排序,由於此時已經具有較好的區域性有序性,故很快得到最終結果,**如下:

#include

#include

using

namespace std;

void

shellsort

(int a,

int n)

;int

main()

a[0]

=1110

;shellsort

(a, n)

;printf

("請輸出排序好的陣列:\n");

for(

int i=

1; i<=n; i++

)return0;

}void

shellsort

(int a,

int n)

a[j +dk]

= a[0]

;}}}

}

直接插入排序與折半插入排序

首先看一下例子,將資料乙個個的插入到乙個列表中,插入後這個列表就排序好了 注意 這個列表是遞增的,而且記憶體空間已分配好,只是沒有填充真正的資料,如下 int insertsort mergetype l,int data for j l len 1 j 0 j else return 0 測試用例...

直接插入排序和折半插入排序

1.直接插入排序 1.1插入排序 insertion sort 的基本思想 每次將乙個待排序的記錄,按其關鍵字大小插入到前面已經排序好的序列中,直到全部記錄插入完成為止.1.2 基本過程 假設待排序的記錄存放在陣列r 1.n 中。初始時,r 1 自成1個有序區,無序區為r 2.n 從i 2起直到i ...

插入排序之直接插入排序和折半插入排序

插入排序的基本思想是 將記錄分為有序和無序兩個序列。從無序序列中任取乙個記錄,然後根據該記錄的關鍵字大小在有序序列中查詢乙個合適的位置,使得該記錄放入這個位置後,這個有序序列仍然有序。每插入乙個記錄就稱為一趟插入排序,經過多趟插入排序,使得無序序列中的記錄全部插入到有序序列中,則排序完成。直接插入排...