好程式設計師Java乾貨分享5分鐘瞭解折半插入排序
好程式設計師 Java 乾貨分享 5 分鐘瞭解折半插入排序,前言: 折半插入排序( Binary Insertion Sort )是對直接插入排序演算法的一種改進。
插入排序思想介紹
折半插入排序與直接插入排序演算法原理相同。只是,在向已排序的資料中插入資料時,採用來折半查詢(二分查詢)。先取已經排序的序列的中間元素,與待插入的資料進行比較,如果中間元素的值大於待插入的資料,那麼待插入的資料屬於陣列的前半部分,否則屬於後半部分。依次類推,不斷縮小範圍,確定要插入的位置。
演算法說明:
待排序資料: 2 , 1 , 6 , 7 , 4
取第一個元素作為有序表,剩餘的元素作為無序表
其中有序表: 2 ;無序表: 1 , 6 , 7 , 4
第一次比較,從無序表中取出第一個數 1 ,與中間值 2 比較, 1<2 , 1 插到 2 的前面,得到
有序表: 1 , 2 ;無序表: 6 , 7 , 4
第二次比較,從無序表中取出第一個數 6 ,與中間值 1 比較, 6>1 ,要放在 1 的後面,再與後半區(有序表: 2 )的中間值 2 比較, 6>2 , 6 插入到 2 的後面,得到
有序表: 1 , 2 , 6 ;無序表: 7 , 4
第三次比較,從無序表中取出第一個數 7 ,與中間值 2 比較, 7>2 , 7 放在 2 後面,再與後半區(有序表: 6 )的中間值 6 比較, 7>6 , 7 放在 6 後面,得到
有序表: 1 , 2 , 6 , 7 ;無序表: 4
第四次比較,從無序表中取出第一個數 4 ,與中間值 2 比較, 4>2 , 4 放在 2 後面,再與後半區(有序表 :6,7 )的中間值 6 比較, 4<6 , 4 放在 6 前面,最終得到:
1 , 2 , 4 , 6 , 7
折半插入排序的程式碼實現
1.private void binaryInsertSort(int arr[]){
2.
3. int low = 0;
4. int high = 0;
5. int m = 0;// 中間位置
6. for(int i = 1; i < arr.length; i++){
7. low = 0;
8. high = i-1;
9. while(low <= high){
10. m = (low+high)/2;
11. if(arr[m] > arr[i])
12. high = m - 1;
13. else
14. low = m + 1;
15. }
16. // 統一移動元素,將待排序元素插入到指定位置
17. temp = arr[i];
18. for(int j=i; j > high+1; j--){
19. arr[j] = arr[j-1];
20. }
21. arr[high+1] = temp;
22. }
23. }
總結
折半插入排序相對穩定,相對於直接插入排序,減少了比較次數;但是相對直接插入排序,移動次數不變。
插入排序思想介紹
折半插入排序與直接插入排序演算法原理相同。只是,在向已排序的資料中插入資料時,採用來折半查詢(二分查詢)。先取已經排序的序列的中間元素,與待插入的資料進行比較,如果中間元素的值大於待插入的資料,那麼待插入的資料屬於陣列的前半部分,否則屬於後半部分。依次類推,不斷縮小範圍,確定要插入的位置 。
演算法說明:
待排序資料: 2 , 1 , 6 , 7 , 4
取第一個元素作為有序表,剩餘的元素作為無序表
其中 有序表: 2 ;無序表: 1 , 6 , 7 , 4
第一次 比較 ,從無序表中取出第一個數 1 , 與中間值 2 比較, 1<2 , 1 插到 2 的前面,得到
有序表: 1 , 2 ;無序表: 6 , 7 , 4
第二次 比較 ,從無序表中取出第一個數 6 , 與中間值 1 比較, 6>1 ,要放在 1 的後面,再與後半區(有序表: 2 )的中間值 2 比較, 6>2 , 6 插入到 2 的後面,得到
有序表: 1 , 2 , 6 ;無序表: 7 , 4
第三次 比較 ,從無序表中取出第一個數 7 , 與中間值 2 比較, 7>2 , 7 放在 2 後面,再與後半區(有序表: 6 )的中間值 6 比較, 7>6 , 7 放在 6 後面,得到
有序表: 1 , 2 , 6 , 7 ;無序表: 4
第四次 比較 ,從無序表中取出第一個數 4 , 與中間值 2 比較, 4>2 , 4 放在 2 後面,再與後半區(有序表 :6,7 )的中間值 6 比較, 4<6 , 4 放在 6 前面,最終得到:
1 , 2 , 4 , 6 , 7
折半插入排序的程式碼實現
1. private void binaryInsertSort( int arr[]){
2.
3. int low = ;
4. int high = ;
5. int m = ; // 中間位置
6. for ( int i = 1 ; i < arr.length; i++){
7. low = ;
8. high = i- 1 ;
9. while (low <= high){
10. m = (low+high)/ 2 ;
11. if (arr[m] > arr[i])
12. high = m - 1 ;
13. else
14. low = m + 1 ;
15. }
16. //統一移動元素,將待排序元素插入到指定位置
17. temp = arr[i];
18. for ( int j=i; j > high+ 1 ; j--){
19. arr[j] = arr[j- 1 ];
20. }
21. arr[high+ 1 ] = temp;
22. }
23. }
總結
折半插入排序相對穩定,相對於直接插入排序,減少了比較次數;但是相對直接插入排序,移動次數不變。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69913892/viewspace-2650003/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 好程式設計師Java乾貨分享Spring框架之IOC原理程式設計師JavaSpring框架
- 好程式設計師Java學習路線分享5分鐘瞭解計數排序程式設計師Java排序
- 好程式設計師Java學習路線分享5分鐘瞭解基數排序程式設計師Java排序
- 好程式設計師Java教程教你5分鐘瞭解快速排序程式設計師Java排序
- 好程式設計師Java教程分享詳細瞭解Javasax解析器程式設計師Java
- 好程式設計師分享自學大資料入門乾貨程式設計師大資料
- 好程式設計師分享乾貨 彈性分散式資料集RDD程式設計師分散式
- 好程式設計師Java分享SpringMVC之@ResponseBody註解程式設計師JavaSpringMVC
- 好程式設計師Java培訓分享Java程式設計技巧程式設計師Java
- 好程式設計師Java培訓分享Java常見排序演算法之插入排序程式設計師Java排序演算法
- 好程式設計師教程分享Java註解和運用註解程式設計程式設計師Java
- 好程式設計師Java教程分享Java之設計模式程式設計師Java設計模式
- 好程式設計師Java培訓分享Java程式設計師技能提升指南程式設計師Java
- 好程式設計師Java學習路線帶你5分鐘瞭解希爾排序程式設計師Java排序
- 好程式設計師Java教程分享Java語法程式設計師Java
- 好程式設計師Java培訓分享For迴圈詳解程式設計師Java
- 好程式設計師Java教程分享List介面程式設計師Java
- 好程式設計師Java教程分享javaweb框架程式設計師JavaWeb框架
- 好程式設計師大資料學習路線Hadoop學習乾貨分享程式設計師大資料Hadoop
- 好程式設計師大資料學習路線分享hdfs學習乾貨程式設計師大資料
- 好程式設計師Java培訓分享Java程式設計師常用的工具類庫程式設計師Java
- 好程式設計師Java培訓分享20個Java程式設計師基礎題程式設計師Java
- 好程式設計師Java教程分享Java面試妙招程式設計師Java面試
- 好程式設計師Java教程分享Java開發工具程式設計師Java
- 好程式設計師Java培訓分享如何快速入門Java程式設計程式設計師Java
- 好程式設計師Java培訓分享SpringBoot -YAML程式設計師JavaSpring BootYAML
- 好程式設計師Java分享SQL語言之索引程式設計師JavaSQL索引
- 好程式設計師java分享spring框架精講程式設計師JavaSpring框架
- 好程式設計師分享java設計模式之享元模式程式設計師Java設計模式
- 好程式設計師Java教程分享Java開發主流框架程式設計師Java框架
- 好程式設計師Java教程分享Java 迴圈結構程式設計師Java
- 好程式設計師Java學習路線分享finalize()方法詳解程式設計師Java
- Java乾貨神總結,程式設計師面試技巧Java程式設計師面試
- 好程式設計師Java培訓分享學Java程式設計要注意什麼程式設計師Java
- 好程式設計師Java培訓分享Java動態代理機制詳解程式設計師Java
- 好程式設計師分享placeholder屬性詳解程式設計師
- 好程式設計師Java教程分享Jmeter效能測試程式設計師JavaJMeter
- 好程式設計師Java教程分享MyBatis Plus介紹程式設計師JavaMyBatis