插入排序之折半插入排序

基本思路:折半插入排序(binary insertion sort)是对插入排序算法的一种改进,由于排序算法过程中,就是不断的依次将元素插入前面已排好序的序列中。由于前半部分为已排好序的数列,这样我们不用按顺序依次寻找插入点,可以采用折半查找的方法来加快寻找插入点的速度。

步骤:
(1) 将一新的元素插入到有序数组中,寻找插入点时,将带插区域的首元素设置为a[low],末元素设置为a[high],比较时则将待插元素与参考元素a[m](m=(low+high)/2)相比较。;
(2)如果待插元素比参考元素小,则选择a[low]到a[m-1]为新的插入区域(即high=m-1),否则选择a[m+1]到a[high]为插入区域;
(3)如此直到low<=high不成立,即将此位置(low)之后所有元素后移一位,并将新元素插入a[high+1]中。

代码如下:

public class Binary_Insert_Sort {
    
    public static void main(String[] args){
        int[] a = {1,3,2,5,4,4,4,4,4,4,5,5,5,5,5,5,5,1,1,1,1,2,2,2,3,4,5,7,3,2,2,24,54};
        long start = System.nanoTime();
        sort(a);
        long end = System.nanoTime();
        System.out.println(end-start  + "   " + Arrays.toString(a));
    }
    ////程序运行时间:14639ms
    public static void sort(int[] s){ 
        for(int i = 1; i < s.length; i++){                              
            int temp = s[i];//待插元素
            int low = 0;
            int high = i-1; 
            while(low<=high){
                int mid = (low+high)/2;
                if(temp>s[mid]){//待插元素比中间值大,取m+1到high区域
                    low = mid+1;
                }else{
                    high= mid-1;
                }
            }
                
            for(int j = i;j>low;j--){//将low后面的数组整体后移
                s[j]=s[j-1];
            }
            s[low]=temp;
        }
    }
    
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 总结一下常见的排序算法。 排序分内排序和外排序。内排序:指在排序期间数据对象全部存放在内存的排序。外排序:指在排序...
    jiangliang阅读 1,377评论 0 1
  • 概述:排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部...
    每天刷两次牙阅读 3,747评论 0 15
  • 概述 排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部...
    蚁前阅读 5,222评论 0 52
  • 1.插入排序—直接插入排序(Straight Insertion Sort) 基本思想: 将一个记录插入到已排序好...
    依依玖玥阅读 1,286评论 0 2
  • 跟我的大小宝贝们分开已经将近一个月了。 出来深圳至今,每天都在想着他们念着他们。 这一个月里,我在思念里重整状态,...
    木子林阅读 253评论 2 3