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

x33g5p2x  于2021-12-18 转载在 其他  
字(3.4k)|赞(0)|评价(0)|浏览(487)

一. 数组的冒泡排序

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

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

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

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

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

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

原始数组 arr

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

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

  1. --------------------------
  2. |【24】| 69 | 80 | 57 | 13 | 【不交换】
  3. --------------------------
  4. 0 -> 1 2 3 4
  5. --------------------------
  6. | 24 |【69】| 80 | 57 | 13 | 【不交换】
  7. --------------------------
  8. 0 1 -> 2 3 4
  9. -------------------------- temp=arr[2];
  10. | 24 | 69 |【80】| 57 | 13 | 【交换23 arr[2]=arr[3];
  11. -------------------------- arr[3]=temp;
  12. 0 1 2 -> 3 4
  13. -------------------------- temp=arr[3];
  14. | 24 | 69 | 57 |【80】| 13 | 【交换34 arr[3]=arr[4];
  15. -------------------------- arr[4]=temp;
  16. 0 1 2 3 -> 4
  17. --------------------------
  18. | 24 | 69 | 57 | 13 |【80】| 【第一次比较完毕】
  19. --------------------------
  20. 0 -> 1 -> 2 -> 3 -> 4

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

  1. --------------------------
  2. |【24】| 69 | 57 | 13 | 80 | 【不交换】
  3. --------------------------
  4. 0 -> 1 2 3 4
  5. --------------------------
  6. | 24 |【69】| 57 | 13 | 80 | 【交换12
  7. --------------------------
  8. 0 1 -> 2 3 4
  9. --------------------------
  10. | 24 | 57 |【69】| 13 | 80 | 【交换23
  11. --------------------------
  12. 0 1 2 -> 3 4
  13. --------------------------
  14. | 24 | 57 | 13 |【69】|【80】| 【第二次比较完毕】 得到了最大值arr[4]和次最大值arr[3]
  15. --------------------------
  16. 0 -> 1 -> 2 -> 3 -> 4

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

  1. -------------------------------
  2. |【13】|【24】|【57】|【69】|【80】| 【第四次比较完毕】
  3. -------------------------------
  4. 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 代码实现

代码:

  1. package Java_study;
  2. /** * * @author 只是甲 * @date 2021-07-01 * @remark 冒泡排序 * */
  3. public class array1 {
  4. public static void main(String[] args) {
  5. //初始数组(静态初始化)
  6. int[] arr1 = {24, 69, 80, 57, 13};
  7. for (int i = 1; i < arr1.length; i++) {
  8. bubbleSortOnce(arr1, i);
  9. printArr(arr1, i);
  10. }
  11. }
  12. /** * @remark 按照格式打印数组 * @param arr 待排序的数组 * @param count */
  13. public static void printArr(int[] arr, int count) {
  14. System.out.print("\r\n第" + count + "次比较结果:[");
  15. StringBuilder sb = new StringBuilder();
  16. for (int i = 0; i < arr.length; i++) {
  17. sb.append(arr[i] + ",");
  18. }
  19. //去掉最后一个逗号
  20. System.out.print(new StringBuilder(sb.toString().substring(0, sb.length() - 1)).append("]"));
  21. }
  22. /** * @remark 冒泡排序一次 * @param arr * @param count 第n次比较,5个元素,比较5-n次(arr.length - n); */
  23. public static void bubbleSortOnce(int[] arr, int count) {
  24. for (int i = 0; i < arr.length - count; i++) {
  25. if (arr[i] > arr[i + 1]) {
  26. int temp = arr[i];
  27. arr[i] = arr[i+1];
  28. arr[i + 1] = temp;
  29. }
  30. }
  31. }
  32. }

测试记录:

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

二. Arrays工具类

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

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

Arrays类中构造方法的问题:

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

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

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

代码:

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

测试记录:

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

参考:

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

相关文章