好程序员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/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/69913892/viewspace-2650003/

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值