BRANDXYF 2022-08-10 17:32 采纳率: 100%
浏览 61
已结题

普通的插入排序比二分插入排序要更快

普通的插入排序比二分插入排序要更快,为什么会这样?

使用10万个随机数测试,普通插入排序752毫秒左右,二分插入排序1928毫秒左右

import java.util.Arrays;
import java.util.Random;

public class Sort {

    public static void insertSort(int[] a){
        int n = a.length;
        int cur;
        int j;
        for(int i=1;i<n;i++){
            cur = a[i];
            for(j=i-1;j>=0;j--){
                if(a[j] > cur){
                    a[j+1] = a[j];
                }
                else{
                    break;
                }
            }
            a[j+1] = cur;
        }
    }

    public static void binInsertSort(int[] a){

        int c;
        int insertValue;
        int insertIndex;
        int n = a.length;
        for(int i=1;i<n;i++){

            insertValue = a[i];
            insertIndex = bSearch1(a,i-1,insertValue);


            for(c=i-1;c>=insertIndex+1;c--){
                a[c+1] = a[c];
            }
            a[insertIndex+1] = insertValue;

        }

    }


    public static int bSearch1(int[] a, int n, int key){
        int low = 0;
        int high = n;
        int mid;
        while(low<=high){
            mid = low + ((high-low)>>1);
            if(a[mid] <= key){
                if(mid==n || a[mid+1]>key){
                    return mid;
                }
                low = mid + 1;
            }else {
                high = mid - 1;
            }
        }
        return -1;
    }

    public static int bSearch2(int[] a, int n, int key){
        int low = 0;
        int high = n;
        int mid;
        while(low<=high){
            mid = low + ((high-low)>>1);
            if(a[mid] == key){
                return mid;
            }else if(a[mid] > key){
                high = mid - 1;
            }else {
                low = mid + 1;
            }
        }
        return low - 1;
    }


    public static void main(String[] args) {
        int n = 100000;
        int[] a1 = new int[n];
        int[] a2 = new int[n];
        for(int i=0;i<n;i++){
            int t = new Random().nextInt(n);
            a1[i] = t;
            a2[i] = t;
        }

        long l = System.currentTimeMillis();
        insertSort(a1);
        System.out.println(System.currentTimeMillis()-l);
        l = System.currentTimeMillis();
        binInsertSort(a2);
        System.out.println(System.currentTimeMillis()-l);


    }

}
  • 写回答

2条回答 默认 最新

  • 快乐鹦鹉 2022-08-10 17:41
    关注

    根本没看见binInsertSort函数在哪

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 8月18日
  • 已采纳回答 8月10日
  • 修改了问题 8月10日
  • 创建了问题 8月10日

悬赏问题

  • ¥15 c语言怎么用printf(“\b \b”)与getch()实现黑框里写入与删除?
  • ¥20 怎么用dlib库的算法识别小麦病虫害
  • ¥15 华为ensp模拟器中S5700交换机在配置过程中老是反复重启
  • ¥15 java写代码遇到问题,求帮助
  • ¥15 uniapp uview http 如何实现统一的请求异常信息提示?
  • ¥15 有了解d3和topogram.js库的吗?有偿请教
  • ¥100 任意维数的K均值聚类
  • ¥15 stamps做sbas-insar,时序沉降图怎么画
  • ¥15 买了个传感器,根据商家发的代码和步骤使用但是代码报错了不会改,有没有人可以看看
  • ¥15 关于#Java#的问题,如何解决?