0
点赞
收藏
分享

微信扫一扫

数据结构(查找和排序)之二分查找和冒泡排序的原理及实现

左手梦圆 2022-03-30 阅读 102

排序:将一组数据按照固定的规则进行排序

一.冒泡排序:

原理:一种排序的方式,对要进行排序的数据中相邻的数据进行两两比较,升序时将较大的数据放在后面,降序时将较小的数据放在后面,直至所有数据按照既定的要求完成所有数据排序

实现步骤:1.对要排序的元素进行遍历,两两比较(遍历到的元素与它的后一个元素进行比较),升序时,将大的元素放在右边。

2.遍历到倒数第二个元素时,最大的元素就已经在最右边。

3.重复执行第一步,但是遍历的元素不要上一轮遍历找到的最大的元素。

代码实现:

public class BubbleSorting {
    public static void main(String[] args) {
        //定义一个需要排序的数组
        int[] arr = {56,1,432,32,78,54,32,3,7,657,563,25,43,6,463,52,56};
        //打印排序前的数组
        System.out.println("排序前:" + Arrays.toString(arr));
        for (int i = 0; i < arr.length - 1; i++) {
            //每一轮循环结束下一次循环少遍历一次,所以为(i + 1)
            for (int j = 0; j < arr.length - (i + 1); j++) {
                //两两比较,遍历的元素大于下一个元素,进行交换
                if (arr[j] >= arr[j + 1]){
                    int temp = arr[j + 1];
                    arr[j + 1] = arr[j];
                    arr[j] = temp;
                }
            }
        }
        System.out.println("排序后:" + Arrays.toString(arr));
    }
}

二.二分查找 

       2.1  二分查找概述

                查找指定元素的位置时,传统的方式是通过遍历,逐个获取每个元素,看是否是要查找的元素,这种方式当数组元素较多时,查找的效率很低,而二分查找,每一次可以去掉一半的查找范围,相对于传统的方式提高了效率。

       2.2  二分查找实现步骤 

                要求:查找时已经是排序好的元素(我这实现是基于升序的元素)

                实现步骤:1.先定义两个指针min和max,min指向第一个元素,max指向最后一个元素

2.定义一个mid指针,其指向(min + max)/ 2。

3.进行比较,如果要查找的元素等于mid指针所指的元素,返回指针的索引或者元素

4.要查找的元素大于mid指针指向的元素,min指向的位置= mid + 1,mid指针指向的位置 =(max + min) / 2。

5.要查找的元素小于mid指针指向的元素,max指向的位置 = mid - 1 ,mid指针指向的位置=(max + min) / 2。

6.重复执行3,4,5步直至直至找到需要找的元素为止,若查找的过程中min > max说明元素不存在,返回-1。

代码实现:

public class BinarySearch {
    public static void main(String[] args) {
        int[] arr = {4,5,6,8,9,10,15,16,17,18};
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入要查找的数字");
        System.out.println(binarySearchIndex(arr,number));
    }
    public static int binarySearchIndex(int[] arr,int number){
        //定义两个变量,表示要查找的范围
        int min = 0 ;
        int max =arr.length - 1 ;
        //循环查找,但是min <= max
        while(min <= max ){
            //计算出中间索引mid的值
            int mid = (min + max) / 2 ;
            //判断mid位置的元素是否为要查找的元素,如果是直接返回对应索引
            if (arr[mid] > number){
                //表示的查找的元素在左边
                max = mid - 1 ;
            }else if (arr[mid] < number){
                min = mid + 1 ;
            }else{
                return mid;
            }
            }
        //如果min大于了max就表示元素不存在,就返回-1
        return -1 ;
    }
}
举报

相关推荐

0 条评论