美文网首页
Java基础系列27-常用api之数组排序和Arrays工具类

Java基础系列27-常用api之数组排序和Arrays工具类

作者: 只是甲 | 来源:发表于2021-08-26 17:14 被阅读0次

    一. 数组的冒泡排序

    冒泡排序 :相邻的两个元素两两比较,元素值较大的元素依次向后置换.

    冒泡排序的基本原理:
      相邻元素两两比较,大的往后放。
      第一次比较,比较完毕后,最大值就出现在了最大索引处。
      第二次比较,比较完毕后,次最大值就出现在了次最大索引处
      ......
      最终我们得到了一个排序好的数组

    交换两个数
    Q:如何交换两个数据呢?
    int a = 10;
    int b = 20;

    A:采用临时变量
    int temp = a;
    a = b;
    b = temp;

    1.1 图解说明数组的冒泡排序

    数组排序之冒泡排序原理图解


    image.png

    原始数组 arr

         --------------------------
         | 24 | 69 | 80 | 57 | 13 |
         --------------------------
           0    1    2    3    4
    

    第一次比较:
    找到最大的值

         --------------------------
         |【24】| 69 | 80 | 57 | 13 |  【不交换】
         --------------------------
           0 -> 1    2    3    4
    
         --------------------------
         | 24 |【69】| 80 | 57 | 13 |  【不交换】
         --------------------------
           0    1 ->  2    3    4
    
         --------------------------              temp=arr[2];
         | 24 | 69 |【80】| 57 | 13 |  【交换2和3】 arr[2]=arr[3];
         --------------------------              arr[3]=temp;
           0    1    2 ->  3    4
    
         --------------------------              temp=arr[3];
         | 24 | 69 | 57 |【80】| 13 |  【交换3和4】 arr[3]=arr[4];
         --------------------------              arr[4]=temp;
           0    1    2    3  ->  4
    
         --------------------------
         | 24 | 69 | 57 | 13 |【80】|  【第一次比较完毕】
         --------------------------
           0 -> 1 -> 2 -> 3 ->  4
    

    第二次比较:
    找到第二大的值

         --------------------------
         |【24】| 69 | 57 | 13 | 80 |  【不交换】
         --------------------------
           0  -> 1    2    3    4
    
         --------------------------
         | 24 |【69】| 57 | 13 | 80 |  【交换1和2】
         --------------------------
           0    1  ->  2   3    4
    
         --------------------------
         | 24 | 57 |【69】| 13 | 80 |  【交换2和3】
         --------------------------
           0    1    2  ->  3   4
    
         --------------------------
         | 24 | 57 | 13 |【69】|【80】|  【第二次比较完毕】 得到了最大值arr[4]和次最大值arr[3]
         --------------------------
           0 -> 1 -> 2 -> 3 ->  4
    

    ......

    第四次比较
    找到第4大的值

         -------------------------------
         |【13】|【24】|【57】|【69】|【80】|  【第四次比较完毕】
         -------------------------------
           0  -> 1  -> 2  -> 3  ->  4
    

    规律:
    规律一:
      第一次比较完毕后,下一次的比较就会少一个元素参加;
      第一次比较,5个元素,比较4次(arr.length - 1);
      第二次比较,5个元素,比较3次(arr.length - 2);
      ...
      第n次比较,5个元素,比较5-n次(arr.length - n);

    规律二:
      总共需要比较 arr.length - 1 次。

    1.2 代码实现

    代码:

    package Java_study;
    
    /**
     * 
     * @author   只是甲
     * @date     2021-07-01
     * @remark   冒泡排序
     *
     */
    public class array1 {
        public static void main(String[] args) {
            //初始数组(静态初始化)
            int[] arr1 = {24, 69, 80, 57, 13};
            
            for (int i = 1; i < arr1.length; i++) {
                bubbleSortOnce(arr1, i);
                printArr(arr1, i);
            }
        }
        
        /**
         * @remark 按照格式打印数组
         * @param arr 待排序的数组
         * @param count
         */
        public static void printArr(int[] arr, int count) {
            System.out.print("\r\n第" + count + "次比较结果:[");
            StringBuilder sb = new StringBuilder();
            
            for (int i = 0; i < arr.length; i++) {
                sb.append(arr[i] + ",");
            }
            //去掉最后一个逗号
            System.out.print(new StringBuilder(sb.toString().substring(0, sb.length() - 1)).append("]"));
        }
        
        /**
         * @remark 冒泡排序一次
         * @param arr
         * @param count 第n次比较,5个元素,比较5-n次(arr.length - n);
         */
        public static void bubbleSortOnce(int[] arr, int count) {
            for (int i = 0; i < arr.length - count; i++) {
                if (arr[i] > arr[i + 1]) {
                    int temp = arr[i];
                    arr[i] = arr[i+1];
                    arr[i + 1] = temp;
                }
            }
        }
    
    }
    

    测试记录:

    
    第1次比较结果:[24,69,57,13,80]
    第2次比较结果:[24,57,13,69,80]
    第3次比较结果:[24,13,57,69,80]
    第4次比较结果:[13,24,57,69,80]
    

    二. Arrays工具类

    Arrays :提供了对数组操作的各种方法。

    public static String toString(int[] a):把数组转成字符串
    public static void sort(int[] a):对数组进行升序排序
    

    Arrays类中构造方法的问题:

    1. Arrays类中真的没有构造方法吗?
      一个类中没有构造方法,系统将提供一个无参构造方法。
      而我们在帮助文档中没有看到Arrays类的构造方法,这是为什么呢?
      Arrays类中有构造方法,只不过构造方法被private修饰,外界是无法使用的。因为外界无法使用,所以帮助文档中就看不到。
    2. 通过查看源码,我们找到了如下的内容:
    private Arrays() {}
    

    工具类的设计思想(Arrays、Math、Collections):

    1. 构造方法私有;
    2. 成员都用static修饰;

    代码:

    package Java_study;
    
    import java.util.Arrays;
    
    /**
     * 
     * @author  只是甲
     * @date    2021-07-01
     * @remark   Arrays类的概述和使用
     *
     */
    public class array2 {
        public static void main(String[] args) {
            //定义一个数组
            int[] arr = {24, 69, 80, 57, 13};
            
            //public static String toString(int[] a):把数组转成字符串
            System.out.println("排序前:" + Arrays.toString(arr));
            
            //public static void sort(int[] a):对数组进行升序排序
            Arrays.sort(arr);
            
            System.out.println("排序后:" + Arrays.toString(arr));
        }
    
    }
    

    测试记录:

    排序前:[24, 69, 80, 57, 13]
    排序后:[13, 24, 57, 69, 80]
    

    参考:

    1. https://blog.csdn.net/qq_43529621/article/details/115858596

    相关文章

      网友评论

          本文标题:Java基础系列27-常用api之数组排序和Arrays工具类

          本文链接:https://www.haomeiwen.com/subject/vmckultx.html