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

2021-07-05 15:51:03 字數 1388 閱讀 8167

a,直接插入排序:排序過程中,整個序列被分成兩部分,前一部分有序,後一部分無序。每次從無序表中取出乙個元素,然後把它插入到有序表中的合適位置,使有序表保持有序,直到無需表部分元素個數為0,排序結束。

b,演算法原理:

1)假設陣列序列依次為a1,a2,.....,an;

2)第一趟比較a1和a2,時前兩個元素公升序排序,第二趟比較a1,a2,a3,使前三個元素公升序排序;

3)每次新元素i插入到前i-1個已經有序的元素中時,依次與i-1,i-2,...,1位置的元素比較,並插入到對應次序位置;

4)以此類推,直到使前n個元素有序,排序結束。

下圖為一組亂序序列直接插入排序的過程:

c,演算法實現:

#include 」iostream」

usingnamespace std;

intmain()

void sort(int, int);

int array = ;

int n = sizeof(array)/sizeof(int*);

sort(array, n);

for(int i = 0; i < n; ++i)

cout<

cout<

return 0;

//直接插入排序

//array表示測試元素序列,n為序列元素個數

voidsort(int array, int n)

int temp,index;

for(int i = 1; i < n; ++i)

//將插入位置之後的元素後移乙個位置

for(int k = i; k > index; --k)

array[k] = array[k-1];

array[index] = temp;

}執行結果:

d,複雜度分析

(a)時間複雜度:

1)如果序列初始為公升序排序,則無需移動,只需比較n-1次即可完成排序,因此最好的時移動次數複雜度 

為o(n),移動次數複雜度為o(1);

2)如果序列初始為降序排序,則最壞需要比較1+2+3+...+(n-1)=n(n-1)/2次,最壞需要移動1+2+...+ 

(n-1)=n(n-1)/2次,因此比較的最壞時間複雜度為o(n^2),移動的最壞時間複雜度為o(n^2);

3)綜上所述,比較的平均時間複雜度為o(n^2),移動的平均時間複雜度為o(n^2)。

(b)空間複雜度:程式中定義了temp和index兩個變數,因此空間複雜度為o(1)。

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

直接插入排序的核心思想是把乙個記錄插入乙個有序序列中,每插入乙個記錄就得到乙個新的有序序列,直到所有記錄都插入成功,得到有序序列。每次插入記錄時的有序序列如何得到,關鍵在第一次,第一次要插入的記錄時序列的第二個值,有序序列只有乙個值,就是第乙個記錄。a j 1 x j 1就是要插入的位置 print...

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

直接插入排序 straight insertion sort 的基本思想 每次將乙個待排序的記錄,按其關鍵字大小插入到前面已經排好序的子串行中的適當位置,直到全部記錄插入完成為止。設陣列為a 0 n 1 其中紅色區域為有序區域 1.初始時,a 0 自成1個有序區,無序區為a 1.n 1 a 0 a ...

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

直接插入排序類似於我們平常在打撲克摸牌時候的一種情形。我習慣於左手拿牌右手摸牌,每次先把左手中的牌齊整齊,然後右手新摸一張牌中把它放到左手中正確的位置,讓它成為乙個新的整齊的牌堆。如果根據上面的思路我們可以發現,直接插入排序的思想就是,從需要排序的第二個數字開始,拿取乙個數,與前面的數字進行比較,放...