• 二分查找和优化冒泡排序


      

    二分查找

    何为二分查找

    1,前提:有已排序数组 A (假设已经做好)

    2.定义左边界 L 、右边界 R ,确定搜索范围,循环执行二分查找(3、4两步)

    3.获取中间索引 M = Floor (( L + R )/2)

    4.中间索引的值 A [ M ] 与待搜索的值 T 进行比较

    ① A [ M ]= T 表示找到,返回中间索引

    ② A [ M ]> T ,中间值右侧的其它元素都大于 T ,无需比较,中间索引左边去找, M - 1设置为右边界,重新查找

    ③ A [ M ]< T ,中间值左侧的其它元素都小于 T ,无需比较,中间索引右边去找, M + 1设置为左边界,重新查找

    5.当 L > R 时,表示没有找到,应结束循环

    /***
     * 2分查找
     */
    public class HalfFind {
        public static void main(String[] args) {
            int[] arr = {1,11,24,33,45,48,56,68,69,73,77,83,85,90,99,107};
            int target = 99;
            System.out.println(halfFind(arr,target));
        }
    
        private static String halfFind(int[] arr, int target) {
            // l:左边界 r:右边界 m:中间索引
            int l = 0,r = arr.length-1,m;
            // 记录查找次数
            int num = 0;
            // 如果左边界大于右边界说明没有找到数据退出循环
            while (l <= r) {
                num++;
                // m = (l + r) / 2;
                //使用右移1位 可以解决int最大数值数据溢出问题 不考虑大数据量可以直接使用 m = (l + r) / 2;
                m = (l + r) >>> 1;
                if (arr[m] == target) {
                    return "查找"+num+"次,找到该元素的索引是:"+m;
                } else if (arr[m] > target) {
                    //说明中间索引右侧元素都大于target 右侧不用比较 把右边界改为 m-1
                    r = m - 1;
                } else {
                    //说明中间索引左侧元素都小于target 左侧不用比较 把左边界改为 m+1
                    l = m + 1;
                }
            }
            return "查找"+num+"次,没有找到该元素!";
        }
    }

      

      冒泡排序

        一般冒泡排序都使用双重for循环依次遍历比对,这里介绍一种记录每次最后一次交换索引位置实现的方法,可以减少不必要的循环次数

    /***
     * 冒泡排序
     */
    public class BubbleSort {
    
        public static void main(String[] args) {
            // 原始数组数据
            int[] arr = {7,2,11,30,26,32,46,57};
            bubbleSort(arr);
        }
        //排序方法
        public static void bubbleSort(int[] arr) {
            // 每次循环需要比较的次数 第一次是数组长度-1
            int n = arr.length - 1;
            while (true) {
                // 用来记录最后一次交换的索引的位置
                int last = 0;
                // 每次循环最大次数是上一次最后一次交换的索引的位置
                for (int i = 0; i < n; i++) {
                    System.out.println("比较次数:"+(i+1));
                    if (arr[i] > arr[i + 1]) {
                        // 如果前一个元素比后一个元素大交换元素的位置
                        swap(arr,i,i+1);
                        // 给最后一次交换的索引位置赋值
                        last = i;
                    }
                }
                // 给下次循环次数赋值
                n = last;
                System.out.println("排序后数组:"+ Arrays.toString(arr));
                if (n == 0) {
                    // 如果下次循环次数是0结束循环
                    break;
                }
            }
        }
        // 交换数组位置方法
        public static void swap(int[] arr,int i,int j) {
            int t = arr[i];
            arr[i] = arr[j];
            arr[j] = t;
        }
    }

     

  • 相关阅读:
    详解Java API之正则表达式
    ios UIWindow 错误使用导致无法接收motionEnded(摇一摇)函数
    ios NSTimer的强引用问题
    ionic 接触的第一个Hybrid项目
    iOS 小经验:UIAnimation空对象导致crash
    iOS GCD 必读推荐,有关于单例使用问题
    ios NSString 转 float的注意
    iOS UIViewController 和 nib 相关的3个方法
    ios delegate 使用注意 assign,weak
    ios 使用autolayout 后button 的frame 无法设置问题!
  • 原文地址:https://www.cnblogs.com/xuxiaobai13/p/15425001.html
Copyright © 2020-2023  润新知