14、排序算法-冒泡排序
来源:https://www.bilibili.com/video/BV1B4411H76f?p=39
一、思路
冒泡排序:从下标较小的元素开始比较,比的是相邻的元素,逆序则交换
如果想从小到大排列,这样一趟比较下来,最后一个就是最大的
例如:[3,9,-1,10,-2]
第一趟:
- 比较3和9,由小到大,不换,[3,9,-1,10,-2]
- 比较9和-1,逆序,换,[3,-1,9,10,-2]
- 比较9和10,不换,[3,-1,9,10,-2]
- 比较10和-2,换,[3,-1,9,-2,10]
第二趟:
- 比较3和-1,换,[-1,3,9,-2,10]
- 比较3和9,不换,[-1,3,9,-2,10]
- 比较9和-2,换,[-1,3,-2,9,10]
- 比较9和10,不换,[-1,3,-2,9,10] (这个可以不用比,最后已经是最大的了)
第三趟:
- 比较-1和3,不换,[-1,3,-2,9,10]
- 比较3和-2,换,[-1,-2,3,9,10](后面不用比了,已经最大)
第四趟:
- 比较-1和-2,换,[-2,-1,3,9,10](后面不用比了,已经最大)
二、实现
1 //冒泡排序 2 public class BubbleSort { 3 public static void main(String[] args) { 4 int[] arr = {3,9,-1,10,-2}; 5 System.out.println(Arrays.toString(arr)); 6 7 bubbleSort(arr); 8 9 System.out.println(Arrays.toString(arr)); 10 } 11 12 public static void bubbleSort(int[] arr){ 13 for (int i = 0; i < arr.length - 1; i++) { 14 for (int j = 0; j < arr.length - 1 - i; j++) { 15 if(arr[j] > arr[j + 1]){ 16 int temp = arr[j]; 17 arr[j] = arr[j + 1]; 18 arr[j + 1] = temp; 19 } 20 } 21 } 22 } 23 24 }
结果
[3, 9, -1, 10, -2]
[-2, -1, 3, 9, 10]
中间用Arrays.toString()方法时出现了点问题,之前一直是自己重写的toString方法,然后直接arr.toString()了,显然是不行的,得记住这个失误。
当然,程序还可以优化一下,加一个标志位,默认为false,一旦运行进入if判断,将其置为true,表明本次进行了交换,在i循环中加入一个判断,如果某一次运行完成没有进行交换,说明已经排序完成了,这样在数据量大的情况下可以节省很长时间。
1 public static void bubbleSort(int[] arr){ 2 //默认本次没有进行交换 3 boolean flag = false; 4 for (int i = 0; i < arr.length - 1; i++) { 5 for (int j = 0; j < arr.length - 1 - i; j++) { 6 if(arr[j] > arr[j + 1]){ 7 flag = true; 8 int temp = arr[j]; 9 arr[j] = arr[j + 1]; 10 arr[j + 1] = temp; 11 } 12 } 13 if(!flag){ 14 //flag = false,确实没交换,已经排序完成了 15 break; 16 }else { 17 flag = false; 18 } 19 } 20 }