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 完成上述操作,直到排序完畢 注 為什麼要從後往...