冒泡、选择、二分法

2021.02.17
第十二次记录
课堂笔记1:
1.使用以下SUN公司提供的数组工具类:java.util.Arrays;
有所方法都是静态的,直接用类名调用
主要使用的是两个方法:
二分法查找:Arrays.binarySearch、排序:Arrays.sort
2.常见的算法:
冒泡排序算法
选择排序算法
查找算法:
二分法查找
3.以上算法在以后的java实际开发中我们不需要使用,因为java已经封装好了,直接调用就行。
代码演示1:

public class ArraysTest01 {
    
    
    public static void main(String[] args) {
    
    
        //工具类中的方法大部分都是静态的
        int[] arr = {
    
    2,4,5,87,74,66,45465,0};
        Arrays.sort(arr);
        for (int i = 0; i < arr.length; i++) {
    
    
            System.out.println(arr[i]);
        }
        //已经排序了,是建立在排序基础之上的
        //注意:这里输出的66的下标是排序之后的下标,并非最开始数组的下标
        //判断一个数组中是否存在该元素,就用以下形式(这个很重要)
        System.out.println(Arrays.binarySearch(arr, 66) == -1
                ? "该元素不存在" : "该元素的下标是:"
                + Arrays.binarySearch(arr, 66));
    }
}

输出结果:
0
2
4
5
66
74
87
45465
该元素的下标是:4

课堂笔记2:
冒泡排序算法:
例如:3,2,7,6,8
拿着3和右边相邻的2进行比较,如果左边大于右边,即3 > 2交换位置
继续拿着上一次比较之后的结果中右边较大的数据和后续的数据进行比较。
代码演示2:

public class BubbleSort {
    
    
    public static void main(String[] args) {
    
    
        int[] arr = {
    
    9,8,10,7,6,0,11};
        int count = 0;
        int count2 = 0;
        //冒泡排序循环
        for (int i = arr.length - 1; i > 0; i--) {
    
    
            for (int j = 0; j < i; j++) {
    
    
                count++;
                if (arr[j] > arr[j + 1]){
    
    
                    //交换位置
                    int temp;
                    temp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = temp;
                    count2++;
                }
            }
        }
        System.out.println("比较次数:" + count + "次");
        System.out.println("交换次数:" + count2 + "次");
        for (int i = 0; i < arr.length; i++) {
    
    
            System.out.println(arr[i]);
        }
    }
}

输出结果:
比较次数:21次
交换次数:13次
0
6
7
8
9
10
11

课堂笔记3:
选择排序:
1.每一次从这堆参与比较的数据当中找出最小值,拿着这个最小值和最前面的元素交换位置。
2.选择排序比冒泡排序好在:每一次的交换位置都是有意义的。
3.关键点:选择排序中的关键在于,你怎么找出一堆数据中最小的。
4.冒泡排序和选择排序实际上比较的次数没变,交换位置的次数变少了。
代码演示3:

public class SelectSort {
    
    
    public static void main(String[] args) {
    
    
        int[] arr = {
    
    9,8,10,7,6,0,11};
        int count = 0;
        int count2 = 0;
        for (int i = 0; i < arr.length - 1; i++) {
    
     //i的值是0 1 2 3
            int min = i;
            for (int j = i + 1; j < arr.length; j++) {
    
    
                count++;
                if (arr[j] < arr[min]){
    
    
                    min = j;
                }
            }
            if (min != i){
    
    
                int temp;
                temp = arr[min];
                arr[min] = arr[i];
                arr[i] = temp;
                count2++;
            }
        }
        for (int i = 0; i < arr.length; i++){
    
    
            System.out.println(arr[i]);
        }
        System.out.println("比较次数:" + count + "次");
        System.out.println("交换次数:" + count2 + "次");
    }
}

输出结果:
0
6
7
8
9
10
11
比较次数:21次
交换次数:5次

课堂笔记4:
数组的元素查找:
1.数组的元素查找有两种方式:
第一种:一个一个挨着找,直到找到为止;
第二种:二分法查找(算法),这个效率较高;
2.二分法查找建立在排序的基础之上;
3.二分法查找原理:
代码演示4:

public class ArraySearch {
    
    
    public static void main(String[] args) {
    
    
        int[] arr = {
    
    1, 15, 21, 84, 85, 90, 45, 100, 200, 486, 798};
        //找出arr数组中200所在的下标
        //调用方法
        int index = binarySearch2(arr, 798);
        System.out.println(index == -1 ? "该元素不存在" : "该元素的下标为:" + index);
    }

    /**
     * 从数组中查找目标元素的下标
     * @param arr 被查找的数组(已排序)
     * @param ele 目标元素
     * @return -1表示该元素不存在,其他表示返回该元素的下标
     */
    private static int binarySearch2(int[] arr, int ele) {
    
    
        //开始下标
        int begin = 0;
        //结束下标
        int end = arr.length - 1;
        //开始元素的下标只要在结束元素下标的左边,就有机会继续循环
        while (begin <= end){
    
    
            //中间下标元素
            int mid = (begin + end) / 2;
            if (arr[mid] == ele){
    
    
                return mid;
            }else if (arr[mid] < ele){
    
    
                //目标在中间的右边
                //开始元素下标需要发生变化(开始元素下标需要重新赋值)
                begin = mid + 1; //一直增
            }else{
    
    
                //arr[mid] > ele
                //目标在中间左边
                //修改结束元素下标
                end = mid - 1;  //一直减
            }
        }
        return -1;
    }
}

输出结果:
该元素的下标为:10

猜你喜欢

转载自blog.csdn.net/qq_55171059/article/details/113838789