Java實(shí)現(xiàn)直接插入排序和折半插入排序算法示例
直接插入排序
1 排序思想:
將待排序的記錄Ri插入到已經(jīng)排好序的記錄R1,R2,……,R(N-1)中。
對(duì)于一個(gè)隨機(jī)序列而言,就是從第二個(gè)元素開(kāi)始,依次將這個(gè)元素插入到它之前的元素中的相應(yīng)位置。它之前的元素已經(jīng)排好序。
第1次排序:將第2個(gè)元素插入到前邊的有序列表(此時(shí)前邊只有一個(gè)元素,當(dāng)然是有序的),之后,這個(gè)序列的前2個(gè)元素就是有序的了。
第2次排序:將第3個(gè)元素插入到前邊長(zhǎng)度為2的有序列表,使得前2個(gè)元素是有序的。
以此類推,直到將第N個(gè)元素插入到前面長(zhǎng)度為(N-1)的有序列表中。
2 算法實(shí)現(xiàn):
// 直接插入排序
void straight_insert_sort(int num[], int len){
int i,j,key;
for(j=1;j<len;j++){
key=num[j];
i=j-1;
while(i>=0&&num[i]>key){
num[i+1]=num[i];
i--;
}
num[i+1]=key;
}
}
3 性能分析:
3.1 空間復(fù)雜度:如上代碼,使用了一個(gè)輔助單元key,空間復(fù)雜度為O(1)
3.2 時(shí)間復(fù)雜度:
3.2.1 最好情況:待排序記錄已經(jīng)是有序的,則一趟排序,關(guān)鍵字比較1次,記錄移動(dòng)2次。則整個(gè)過(guò)程
比較次數(shù)為

記錄移動(dòng)次數(shù)為

時(shí)間復(fù)雜度O(n)
3.2.2 最壞情況:待排序記錄已經(jīng)是逆序的,則一趟排序,關(guān)鍵字比較次數(shù)i次(從i-1到0),記錄移動(dòng)(i+2)次。整個(gè)過(guò)程
比較次數(shù)為

記錄移動(dòng)次數(shù)為

時(shí)間復(fù)雜度O(n^2)
3.2.3 平均時(shí)間復(fù)雜度:O(n^2)
3.3 穩(wěn)定性:穩(wěn)定
折半插入排序
1 排序思想:
直接排序的基礎(chǔ)上,將待排序的記錄Ri插入到已經(jīng)排好序的記錄R1,R2,……,R(N-1)中,由于記錄R1,R2,……,R(N-1)已經(jīng)排好序,所以在查找插入位置時(shí)可采用“折半查找”。
2 算法實(shí)現(xiàn):
// 折半插入排序
void binary_insert_sort(int num[], int len){
int i,j,key,low,high,mid;
for(i=1;i<len;i++){
key=num[i];
low=0;
high=i-1;
mid=(low+high)/2;
// 尋找插入點(diǎn),最終插入點(diǎn)在low
while(low<=high){
if(key<num[mid])
high=mid-1;
else
low=mid+1;
mid=(low+high)/2;
}
// 移動(dòng)記錄
for(j=i;j>low;j--){
num[j]=num[j-1];
}
// 插入記錄
num[low]=key;
}
}
3 性能分析:
3.1 空間復(fù)雜度:如上代碼,使用了一個(gè)輔助單元key,空間復(fù)雜度為O(1)
3.2 時(shí)間復(fù)雜度:雖然折半查找減少了記錄比較次數(shù),但沒(méi)有減少移動(dòng)次數(shù),因此時(shí)間復(fù)雜度同直接查找算法。
3.2.1 最好情況:時(shí)間復(fù)雜度O(n)
3.2.2 最壞情況:時(shí)間復(fù)雜度O(n^2)
3.2.3 平均時(shí)間復(fù)雜度:O(n^2)
3.3 穩(wěn)定性:穩(wěn)定
相關(guān)文章
關(guān)于ApplicationContext的三個(gè)常用實(shí)現(xiàn)類
這篇文章主要介紹了關(guān)于ApplicationContext的三個(gè)常用實(shí)現(xiàn)類,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-06-06
Java程序執(zhí)行時(shí)間的2種簡(jiǎn)單方法
這篇文章介紹了Java程序執(zhí)行時(shí)間的2種簡(jiǎn)單方法,有需要的朋友可以參考一下2013-09-09
SpringBoot配置GlobalExceptionHandler全局異常處理器案例
這篇文章主要介紹了SpringBoot配置GlobalExceptionHandler全局異常處理器案例,通過(guò)簡(jiǎn)要的文章說(shuō)明如何去進(jìn)行配置以及使用,需要的朋友可以參考下2021-06-06
Springboot?JPA如何使用distinct返回對(duì)象
這篇文章主要介紹了Springboot?JPA如何使用distinct返回對(duì)象,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-02-02
Java實(shí)現(xiàn)酒店客房管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)酒店客房管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-02-02
SpringData JPA Mongodb查詢部分字段問(wèn)題
這篇文章主要介紹了SpringData JPA Mongodb查詢部分字段問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-08-08
Spring中配置和讀取多個(gè)Properties文件的方式方法
本篇文章主要介紹了Spring中配置和讀取多個(gè)Properties文件的方式方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2017-04-04

