資料結構 內部排序 插入排序

2021-10-08 22:57:35 字數 2358 閱讀 9166

4.main函式

5.小結

【說明】以下**實現最終均為遞增序列,即從小到大排序。

#include

#define elemtype int

/*函式宣告*/

void

directinsertsort

(elemtype a

, int n)

;//1.直接插入排序

void

halfinsertsort

(elemtype a

, int n)

;//2.折半插入排序

void

shellsort

(elemtype a

, int n)

;//3.希爾排序

//1.直接插入排序

void

directinsertsort

(elemtype a

, int n)

}

//2.折半插入排序

void

halfinsertsort

(elemtype a

, int n)

for(j = i -

1; j >= high +

1; j--)a

[j +1]

=a[j];

//統一後移元素,空出插入位置

a[high +1]

=a[0

];//插入指定位置

//或者 a[low] = a[0]; 因為最後是在low>high時退出迴圈的,故low=high+1

}}

//3.希爾排序

void

shellsort

(elemtype a

, int n)

}

int main()

一、插入排序的概念

二、關於三種插入排序的關係

逐漸優化:直接插入排序——>折半插入排序——>希爾排序

[解釋]

給定乙個亂序序列,從第2個元素開始,依次和前面元素比較(即順序查詢),也就是進行直接插入排序。因此,每一趟直接插入排序開始時,它前面的序列都是有序的(因為前面的已經比過了)。

既然前面的元素有序,則可以折半查詢來提高查詢插入位置的效率,也就是折半插入排序

試想:如果給定序列本身就由小到大,那麼則只需要從第2個元素開始比較,不需要移動,由此可見直接插入排序更適用於基本有序且資料量不大的排序表,希爾排序就是基於這兩點分析進一步改進的,由部分有序到整體有序。

三、關於三種插入排序的效能分析

直接插入排序

空間複雜度:o(1)

時間複雜度:o(n2)

穩定性:穩定

適用性:適用於順序儲存和鏈式儲存的線性表

折半插入排序

空間複雜度:o(1)

時間複雜度:o(n2)

穩定性:穩定

適用:僅適用於順序儲存的線性表

希爾排序(縮小增量排序)

空間複雜度:o(1)

時間複雜度:最壞為o(n2)

穩定性:不穩定

適用:僅適用於順序儲存的線性表

【注】:當增量d=1時,希爾排序會退化為直接插入排序

四、其他說明

對直接插入排序和折半插入排序來說,每一趟排序都會得到乙個部分有序的序列,這可以作為判斷是否進行了直接插入排序或折半插入的依據,而希爾排序不會。

關於演算法適用於順序儲存還是鏈式儲存,主要看在演算法的執行過程中,是否涉及到了對元素的隨機訪問,如果涉及到了對元素的隨機訪問,則鍊錶不適用。就上述三種排序演算法來說,直接插入排序 採用的是順序查詢,挨個找,鍊錶也可以;而折半插入排序 採用的是折半查詢,對mid指標來說,他是隨機訪問的,所以鍊錶不行;希爾排序 也是同樣的,因為每次增量d都是變化的,也是隨機訪問,所以鍊錶不行。

需要注意的是,大部分的排序演算法都僅適用於順序儲存的線性表

資料結構 內部排序之插入排序

內部排序之插入排序 include using namespace std include 直接插入排序 1.就地排序,不需要申請新的陣列!2.需要哨兵複製待插入的資料 3.採用邊比較邊移位的方式 4.空間複雜度為o 1 時間複雜度為o n n void insert sort1 int a,int...

資料結構 插入排序

演算法中經常會用到各種各樣的演算法,比較簡答的思想就是氣泡排序,一般剛開始程式設計時遇到排序問題時,會很容易想到冒泡排,氣泡排序是通過兩輛比較數值,從而將數字移動到開始或者末尾的位置,反覆重複這個過程從而就達到了排序的目的。其時間複雜度大概是 n2 還有一種比較常用的插入排序,其思想與氣泡排序比較類...

資料結構 插入排序

一 直接插入排序 1 直接插入排序的演算法思想 r i 的鍵值ki與r 0 r i 1 的鍵值依次比較 從後往前比 找到r i 應插入的位置,並把從該位置開始的記錄後移乙個位置,把r i 插入到找到的插入位置,完成一趟直接排序 重複選r i 1 r n 完成上述操作,直到排序完畢 注 為什麼要從後往...