Java选择排序、二分查找

这篇具有很好参考价值的文章主要介绍了Java选择排序、二分查找。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、选择排序

1.选择排序的思想

每轮选择当前的位置,开始找后面的较小值与该位置进行交换。

第一轮:选择当前位置,开始找后面的较小值与该位置进行交换。

Java选择排序、二分查找

 5与1交换后,1就在当前位置,因此,1与后面的所有值进行比较,后面的值都大于1,所以1的位置不变。

Java选择排序、二分查找

 第二轮:选择当前位置,当前位置是5,所以5与3比较,大于3,所以5与3进行交换

Java选择排序、二分查找

5与·3交换后,3就在当前位置,因此,3与后面的所有值进行比较,后面的2小于3,所以3与2进行交换

Java选择排序、二分查找

第三轮:选择当前位置,当前位置是5,所以5与3比较,大于3,所以5与三进行交换

Java选择排序、二分查找

2.选择排序的关键 

确定总共需要选择几轮:数组的长度-1。

比如:数组有5个元素,只需要比4轮,就可以排序完

控制每轮从当前位置为基准,与后面元素选择几次

    public static void main(String[] args) {
//        定义数组传入一组数据
        int[] numbers = {4,1,2,3};
//        输出原数组内容
        System.out.println("排序前"+ Arrays.toString(numbers));
//        定义外部for循环,控制选择几轮:数组长度-1
        for (int i = 0; i < numbers.length -1; i++) {
//            定义内部for循环,控制选择几次:当前位置+1,也就是后一位
            for (int j = i+1; j < numbers.length; j++) {
//                当前位置:numbers[i]
//                如果后面有比当前位置更小的数据,则进行交换
                if (numbers[j]<numbers[i]){
//                    交换位置
//                    先定义一个临时变量将当前位置的数据存一下
                    int temp = numbers[i];
//                    再将后面的数据赋值给当前的位置
                    numbers[i] = numbers[j];
//                    最后将当前位置的数据赋值给后面的位置
                    numbers[j] = temp;
                }
            }
        }
//        全部交换完成,输出排序后的数组内容
        System.out.println("排序后"+Arrays.toString(numbers));
    }

Java选择排序、二分查找

二、二分查找

1.基本查找

需求:

我要查找数组中的3在哪个位置索引?

如果是基本查找,就需要从第一个位置一个一个的往后找。

Java选择排序、二分查找

结论:在数据量特别大的时候,基本查找从前往后寻找的性能是很差的。

2.二分查找 

二分查找性能好,前提必须是排好序的数据。

二分查找相当于每次去掉一半的查找范围。

找到元素的执行原理:

需求:

我要查找数组中的3在哪个位置索引?

Java选择排序、二分查找

 二分查找会定一个位置在首,定一个位置在尾。

Java选择排序、二分查找

之后会找,首和尾的一半的位置。

 Java选择排序、二分查找

然后发现数据3小于首和尾一半位置的数据,直接从左边开始找,将右边干掉

Java选择排序、二分查找

因此,尾部的位置就是:一半的位置-1.

Java选择排序、二分查找

然后,又找首和尾的一半的位置。

Java选择排序、二分查找

之后,发现数据3大于首和尾一半位置的数据,直接从右边开始找,将左边干掉。

 Java选择排序、二分查找

 然后,首都的位置就是:一半的位置+1

Java选择排序、二分查找

之后,又找首和尾一半的位置

Java选择排序、二分查找

然后,发现数据11大于首和尾一半位置的数据,直接从右边开始找,将左边干掉

Java选择排序、二分查找

  然后,首位置就是:一半的位置+1

Java选择排序、二分查找

之后,又找首和尾一半的位置。

Java选择排序、二分查找

 然后,发现数据11大于首和尾一半位置的数据,直接从右边开始找,将左边干掉。

Java选择排序、二分查找

此时,首位置就是:一半位置+1,然后发现首尾位置重合了,因此,一半的位置还是自己,但是已经是最后一次查找了,数据还是不相等 

Java选择排序、二分查找

结论:二分查找正常的检索条件是首位置min<=尾位置max,但是现在是!=,因此属于找不到,元素不存在

    public static void main(String[] args) {
//        定义一个数组,传入一组数据
        int [] arr ={11,33,44,99,15,35};
//        二分查找的前提是排好序的数据,所以先排序
        Arrays.sort(arr);
//        输出排好序的数据内容
        System.out.println("排序后"+ Arrays.toString(arr));
//        调用二分查找的方法查找元素
        int index1 = binarySearch(arr,15);
        System.out.println("该元素的位置索引:"+index1);
        int index2 = binarySearch(arr,99);
        System.out.println("该元素的位置索引:"+index2);

    }
//    二分查找算法的实现方法
    public static int binarySearch(int[]arr,int data){
//        定义首和尾
        int head =0;
        int tail = arr.length -1;
//        定义循环:当首位置<=尾位置时,开始二分查询
        while (head <= tail){
//        找首和尾位置的一半的位置(中间索引) 中间索引=(首索引-尾索引)/2
            int midIndex = (head +tail) / 2;
//            当要找的元素大于中间索引位置的元素时
            if (data > arr[midIndex]){
//                说明要找的元素在尾位置那边,更新首位置的索引 = 中间位置的索引-1
                head = midIndex+1;
            }else if (data < arr[midIndex]){
//                当要找的元素 小于 中间索引位置的元素时:
//                说明要找的元素在首位置那边,更新尾位置的索引 = 中间位置的索引-1
                tail = midIndex-1;
            }else {
//                当要找的元素等于中间索引位置元素时,说明要找的元素已经找到,返回该元素的位置索引
                return midIndex;
            }
        }
//        循环结束,说明找不到要找的元素返回-1
        return -1;
    }

控制台输出结果:

Java选择排序、二分查找

 

总结 数组的二分查找的实现步骤是什么?

定义变量记录首和尾的位置;
使用while循环控制二分查询(条件是首位置 <= 尾位置);
循环内部获取中间元素索引(中间元素的索引 = (首位置的索引 + 尾位置的索引) / 2);
判断当前要找的元素如果大于中间位置的元素,首位置 = 中间索引 +1;
判断当前要找的元素如果小于中间位置的元素,首位置 = 中间索引 -1;
判断当要找的元素如果等于中间位置的元素,返回当前中间元素的索引;
循环结束,说明查无此元素!返回-1。文章来源地址https://www.toymoban.com/news/detail-424778.html

到了这里,关于Java选择排序、二分查找的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 34. 在排序数组中查找元素的第一个和最后一个位置(二分查找)

    二分查找到目标值然后左右找到坐标 问题在于:找左右坐标的时候时间复杂度不是 O(logN) 之前提到过二分查找不仅可找到相等的数值,更关键的是 它可以将数组分为截然不同的两种情况 ,因此我们可以借助这个性质找到 第一个大于等于 target 的值(左下标) 和 第一个大于

    2024年01月22日
    浏览(52)
  • 二分查找实例1(在排序数组中查找元素的第一个和最后一个位置)

    给你一个按照非递减顺序排列的整数数组  nums ,和一个目标值  target 。请你找出给定目标值在数组中的开始位置和结束位置。 如果数组中不存在目标值  target ,返回  [-1, -1] 。 你必须设计并实现时间复杂度为  O(log n)  的算法解决此问题。 示例 1: 示例 2: 示例 3: 提示

    2024年02月09日
    浏览(46)
  • c语言经典算法—二分查找,冒泡,选择,插入,归并,快排,堆排

             1、前提条件:数据有序,随机访问;          2、实现:递归实现,非递归实现          3、注意事项:                 循环退出条件:low =high,low = high.说明还有一个元素,该元素还要与key进行比较                 mid的取值:mid=(low + high)/2;mid = l

    2024年02月05日
    浏览(45)
  • 【算法训练-数组 五】【二分查找】:旋转排序数组的最小数字、旋转排序数组的指定数字

    废话不多说,喊一句号子鼓励自己:程序员永不失业,程序员走向架构!本篇Blog的主题是【数组的二分查找】,使用【数组】这个基本的数据结构来实现,这个高频题的站点是: CodeTop ,筛选条件为: 目标公司+最近一年+出现频率排序 ,由高到低的去 牛客TOP101 去找,只有两

    2024年02月09日
    浏览(50)
  • 插入,选择,堆,快速排序算法思想与复杂度

    目录 插入排序 思想 算法步骤 代码 复杂度 选择排序 思想 算法步骤 代码 复杂度 堆排序  思想 算法步骤 代码 复杂度  快速排序  思想 算法步骤 代码 复杂度 稳定性 插入排序是一种简单直观的排序算法。它的工作原理是将数组分为 已排序 和 未排序 两部分,然后依次将未

    2024年02月15日
    浏览(38)
  • 每天一道leetcode:剑指 Offer 53 - I. 在排序数组中查找数字 I(适合初学者&二分查找)

    统计一个数字在排序数组中出现的次数。 0 = nums.length = 10^5 -10^9 = nums[i] = 10^9 nums 是一个非递减数组 -10^9 = target = 10^9 使用两次二分查找找到target在数组中的左右边界,然后长度就是右边界减去左边界再加一,最后返回长度即可。   欢迎大家在评论区讨论,如有不懂的代码部分

    2024年02月14日
    浏览(56)
  • 二分查找详解(Java)

    在我们了解二分查找之前,我们先来了解线性查找 线性查找的思想:  我们在对数组遍历的时候,通过每个值每个值的判断去实现我们的待查找的值是否存在当前数组中,如果存在就返回当前的索引。 代码实现: 此时我们发现当前数组的顺序是无序的,当我们在有序数组中

    2024年02月12日
    浏览(38)
  • java实现二分查找算法

    递归实现: public static int binarySearchRecursive(int[] arr, int target) {     return binarySearchRecursive(arr, target, 0, arr.length - 1); }   private static int binarySearchRecursive(int[] arr, int target, int low, int high) {     if (low high) {         return -1; // 没有找到目标元素     }          int mid = (low + high) / 2

    2024年04月09日
    浏览(44)
  • 二分查找java

    给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。 示例 1: 输入: nums = [-1,0,3,5,9,12], target = 9 输出: 4 解释: 9 出现在 nums 中并且下标为 4 示例 2: 输入: nums = [-1,0,3,5,9,12], target = 2 输出:

    2024年02月08日
    浏览(37)
  • Java 语言实现二分查找算法

    【引言】 二分查找算法是一种高效且常用的查找算法。它适用于已排序的数组或列表,并通过将目标值与中间值进行比较,来确定目标值在左侧还是右侧。本文将使用Java语言实现二分查找算法,并详细讲解其思想和代码实现。 【算法思想】 二分查找的核心思想是不断缩小查

    2024年02月11日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包