Java實(shí)現(xiàn)直接插入排序和折半插入排序算法示例
直接插入排序
1 排序思想:
將待排序的記錄Ri插入到已經(jīng)排好序的記錄R1,R2,……,R(N-1)中。
對于一個隨機(jī)序列而言,就是從第二個元素開始,依次將這個元素插入到它之前的元素中的相應(yīng)位置。它之前的元素已經(jīng)排好序。
第1次排序:將第2個元素插入到前邊的有序列表(此時前邊只有一個元素,當(dāng)然是有序的),之后,這個序列的前2個元素就是有序的了。
第2次排序:將第3個元素插入到前邊長度為2的有序列表,使得前2個元素是有序的。
以此類推,直到將第N個元素插入到前面長度為(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ù)雜度:如上代碼,使用了一個輔助單元key,空間復(fù)雜度為O(1)
3.2 時間復(fù)雜度:
3.2.1 最好情況:待排序記錄已經(jīng)是有序的,則一趟排序,關(guān)鍵字比較1次,記錄移動2次。則整個過程
比較次數(shù)為
記錄移動次數(shù)為
時間復(fù)雜度O(n)
3.2.2 最壞情況:待排序記錄已經(jīng)是逆序的,則一趟排序,關(guān)鍵字比較次數(shù)i次(從i-1到0),記錄移動(i+2)次。整個過程
比較次數(shù)為
記錄移動次數(shù)為
時間復(fù)雜度O(n^2)
3.2.3 平均時間復(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)排好序,所以在查找插入位置時可采用“折半查找”。
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; } // 移動記錄 for(j=i;j>low;j--){ num[j]=num[j-1]; } // 插入記錄 num[low]=key; } }
3 性能分析:
3.1 空間復(fù)雜度:如上代碼,使用了一個輔助單元key,空間復(fù)雜度為O(1)
3.2 時間復(fù)雜度:雖然折半查找減少了記錄比較次數(shù),但沒有減少移動次數(shù),因此時間復(fù)雜度同直接查找算法。
3.2.1 最好情況:時間復(fù)雜度O(n)
3.2.2 最壞情況:時間復(fù)雜度O(n^2)
3.2.3 平均時間復(fù)雜度:O(n^2)
3.3 穩(wěn)定性:穩(wěn)定
相關(guān)文章
Java實(shí)現(xiàn)非阻塞式服務(wù)器的示例代碼
這篇文章主要為大家詳細(xì)介紹了如何利用Java實(shí)現(xiàn)一個簡單的非阻塞式服務(wù)器,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價值,需要的可以參考一下2023-05-05吊打Java面試官!整理了一周的Spring面試大全(附答案)
這篇文章主要介紹了Spring面試資料(附答案)建議收藏留存,學(xué)Java的小伙伴都知道Spring是面試的必問環(huán)節(jié),看完了一天就可掌握數(shù)據(jù)結(jié)構(gòu)和算法的面試題,快來看看吧2021-08-08關(guān)于QueryWrapper,實(shí)現(xiàn)MybatisPlus多表關(guān)聯(lián)查詢方式
這篇文章主要介紹了關(guān)于QueryWrapper,實(shí)現(xiàn)MybatisPlus多表關(guān)聯(lián)查詢方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教。2022-01-01java獲取ip地址與網(wǎng)絡(luò)接口的方法示例
這篇文章主要給大家介紹了關(guān)于利用java如何獲取ip地址與網(wǎng)絡(luò)接口的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2018-01-01Java EE項(xiàng)目中的異常處理總結(jié)(一篇不得不看的文章)
什么是異常?運(yùn)行時發(fā)生的可被捕獲和處理的錯誤。這篇文章主要介紹了Java EE項(xiàng)目中的異常處理總結(jié),有需要的可以了解一下。2016-11-11Java生成隨機(jī)姓名、性別和年齡的實(shí)現(xiàn)示例
這篇文章主要介紹了Java生成隨機(jī)姓名、性別和年齡的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09