二分法

写个动机。之前上大学的时候听老师说二分法,那时候也记得自己听的七七八八,无非就是把要插入的数据跟中间的数据比,如果大的话就和右边的二分之一比,如果小就和左边的二分之一比。听着感觉是这么回事儿,但是最近想自己写写算法的玩意儿,发现用一个二分法来排序一个无序的数组,想了蛮久的。有必要记录一下。

    static void sortArray(int[] array) {
        for (int i = 1; i < array.length; i++) {
            int temp = array[i];
            int start = 0;
            //只去排序前面已经有顺序的元素,所以-1
            int end = i - 1;
            //因为数组是从0开始算下标的,所以这边不是+1而是-1来计算中间的下标
            int middle = start;
            while ((end - start) > 1 && (array[middle] != temp)) {
                middle = (start + end) / 2;
                if (temp < array[middle]) {
                    //要放入的数比中间值小,要放入的值在左边插入
//                if(temp>)
                    end = middle;
                } else if (temp > array[middle]) {
                    //要放入的数比中间值大,要放入的值在右边插入
                    start = middle;
                } else {
                    //刚好相等,要放入的数就在这个位置
                }
            }
            //从这个点开始到i位置的数据都要往右移动一个位置
            int upPosition = 0;
            if (array[middle] == temp) {
                //刚好是中间相等
                upPosition = middle;
            } else if (array[start] >= temp) {
                //插入进来的数是最小的,直接放在最左边
                upPosition = start;
            } else if (array[end] <= temp) {
                //插入进来的数是最大的,直接放在最右边
                upPosition = i;
            } else {
                //放入进来的数刚好就是:start<temp<end,这个区间
                upPosition = end;
            }
            //从upPosition开始到i结束
            for (int j = i; j > upPosition; j--) {
                array[j] = array[j - 1];
            }
            array[upPosition] = temp;
        }
        for (int i = 0; i < array.length; i++) {
            System.out.print(array[i] + ",");
        }
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值