BRANDXYF 2022-08-10 09: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 09:41
    关注

    根本没看见binInsertSort函数在哪

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
    BRANDXYF 2022-08-10 09:45

    不好意思贴错了,已经改过来了

    回复
    快乐鹦鹉 回复 BRANDXYF 2022-08-10 09:53

    网上都测试都是二分法要快很多,你还是比较一下你的二分法和网上的有啥差别吧

    回复
    快乐鹦鹉 回复 BRANDXYF 2022-08-10 09:54

    从时间复杂度来说,一个是O(n的平方),一个是O(nlogn),应该数量越大,速度差越明显

    回复
    展开全部6条评论
查看更多回答(1条)
编辑
预览

报告相同问题?

问题事件

  • 系统已结题 8月17日
  • 已采纳回答 8月10日
  • 修改了问题 8月10日
  • 创建了问题 8月10日
手机看
程序员都在用的中文IT技术交流社区

程序员都在用的中文IT技术交流社区

专业的中文 IT 技术社区,与千万技术人共成长

专业的中文 IT 技术社区,与千万技术人共成长

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

客服 返回
顶部