好程序员Java干货分享5分钟了解折半插入排序

好程序员Java干货分享5分钟了解折半插入排序,前言: 折半插入排序(Binary Insertion Sort)是对直接插入排序算法的一种改进。

插入排序思想介绍

折半插入排序与直接插入排序算法原理相同。只是,在向已排序的数据中插入数据时,采用来折半查找(二分查找)。先取已经排序的序列的中间元素,与待插入的数据进行比较,如果中间元素的值大于待插入的数据,那么待插入的数据属于数组的前半部分,否则属于后半部分。依次类推,不断缩小范围,确定要插入的位置。

算法说明:

待排序数据:21674

取第一个元素作为有序表,剩余的元素作为无序表

     其中有序表:2;无序表:1674

第一次比较,从无序表中取出第一个数 1,与中间值2比较,1<21插到2的前面,得到

     有序表:12;无序表:674

第二次比较,从无序表中取出第一个数 6,与中间值1比较,6>1,要放在1的后面,再与后半区(有序表:2)的中间值2比较,6>26插入到2的后面,得到

     有序表:126;无序表:74

第三次比较,从无序表中取出第一个数 7,与中间值2比较,7>27放在2后面,再与后半区(有序表:6)的中间值6比较,7>67放在6后面,得到

     有序表:1267;无序表:4

第四次比较,从无序表中取出第一个数 4,与中间值2比较,4>24放在2后面,再与后半区(有序表:6,7)的中间值6比较,4<64放在6前面,最终得到:

     12467

折半插入排序的代码实现

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.    }  

总结

折半插入排序相对稳定,相对于直接插入排序,减少了比较次数;但是相对直接插入排序,移动次数不变。

插入排序思想介绍

折半插入排序与直接插入排序算法原理相同。只是,在向已排序的数据中插入数据时,采用来折半查找(二分查找)。先取已经排序的序列的中间元素,与待插入的数据进行比较,如果中间元素的值大于待插入的数据,那么待插入的数据属于数组的前半部分,否则属于后半部分。依次类推,不断缩小范围,确定要插入的位置

算法说明:

待排序数据:21674

取第一个元素作为有序表,剩余的元素作为无序表

     其中有序表:2;无序表:1674

第一次比较,从无序表中取出第一个数 1与中间值2比较,1<21插到2的前面,得到

     有序表:12;无序表:674

第二次比较,从无序表中取出第一个数 6与中间值1比较,6>1,要放在1的后面,再与后半区(有序表:2)的中间值2比较,6>26插入到2的后面,得到

     有序表:126;无序表:74

第三次比较,从无序表中取出第一个数 7与中间值2比较,7>27放在2后面,再与后半区(有序表:6)的中间值6比较,7>67放在6后面,得到

     有序表:1267;无序表:4

第四次比较,从无序表中取出第一个数 4与中间值2比较,4>24放在2后面,再与后半区(有序表:6,7)的中间值6比较,4<64放在6前面,最终得到:

     12467

折半插入排序的代码实现

  1. private void binaryInsertSort(int arr[]){  

  2. int low = 0;  

  3. int high = 0;  

  4. int m = 0;// 中间位置  

  5. for(int i = 1; i < arr.length; i++){  

  6. low = 0;  

  7. high = i-1;  

  8. while(low <= high){  

  9. m = (low+high)/2;  

  10. if(arr[m] > arr[i])  

  11. high = m - 1;  

  12. else  

  13. low = m + 1;  

  14. }  

  15. //统一移动元素,将待排序元素插入到指定位置  

  16. temp = arr[i];  

  17. for(int j=i; j > high+1; j--){  

  18. arr[j] = arr[j-1];  

  19. }  

  20. arr[high+1] = temp;  

  21. }          

  22. }  

总结

折半插入排序相对稳定,相对于直接插入排序,减少了比较次数;但是相对直接插入排序,移动次数不变。

转载于:https://www.cnblogs.com/gcghcxy/p/11158369.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值