【算法】二分排序和二分查找

二分排序和二分查找

一、二分查找

/**
     *@title: binarySearch 
     *@description: 二分查找(参数数组必须有序)
     *@date: 2019年12月21日 上午10:37:25
     *@param arrayA 有序数组
     *@param key 关键元素
     *@return int 关键元素在数组中的下标
     */
    public static int binarySearch(int[] arrayA, int key) {
        int low = 0;
        int high = arrayA.length - 1;
        int mid = 0;

        while (low <= high) {
            mid = (low + high) / 2;

            if (key < arrayA[mid]) {
                high = mid - 1;
            } else if (key > arrayA[mid]) {
                low = mid + 1;
            } else
                break;
        }

        return mid;
    }



二、二分排序

参考:

https://www.jianshu.com/p/677359c1cc15


代码:

/**
      *@title: binarySort 
      *@description: 二分排序:总共有N个元素。
      *当插入第i个元素时,对前面的0~i-1个元素使用二分法,
      *找到该元素插入位置(相当于在有序数组中,一个一个插入新数值)
      *@date: 2019年12月21日 下午12:09:27
      *@param array 待排序数组
      *@return int[] 排序后的数组
      */
    public static int[] binarySort(int[] array) {

        for (int i = 1; i < array.length; i++) {
            int temp = array[i];
            int low = 0;
            int high = i - 1;
            int mid = -1;

            while (low <= high) {
                mid = (low + high) / 2;

                if (temp < array[mid]) {
                    high = mid - 1;
                } else { // temp >= array[mid])
                    low = mid + 1;
                }
            }

            // 将low下标以后的元素全部向后移一位
            for (int j = i - 1; j >= low; j--) {
                array[j + 1] = array[j];
            }

            if (low != i)// 若待插入元素的插入位置不等于当前位置,则插入
                array[low] = temp;
        }

        return array;
    }



注意 二分排序与二分查找的区别:

两者的while循环内部不同,二分排序中判定相等不需要跳出循环

【二分排序】跳出循环后下标low标识关键元素需要插入的位置。

猜你喜欢

转载自www.cnblogs.com/musecho/p/12077028.html