冒泡排序(Bubble Sort)
冒泡排序是一种交换排序。
基本思想
两两比较相邻记录的关键字,如果反序则交换,直到没有反序的记录为止。
思路
代码实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
| package com.nanzx.sort;
import java.util.Arrays;
public class BubbleSort {
public static void main(String[] args) { int arr[] = { 6, 3, 5, 7, 0 }; int temp; for (int j = 0; j < arr.length - 1; j++) { if (arr[j] > arr[j + 1]) { temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } System.out.println("第一趟排序后的数组"); System.out.println(Arrays.toString(arr));
for (int j = 0; j < arr.length - 2; j++) { if (arr[j] > arr[j + 1]) { temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } System.out.println("第二趟排序后的数组"); System.out.println(Arrays.toString(arr));
for (int j = 0; j < arr.length - 3; j++) { if (arr[j] > arr[j + 1]) { temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } System.out.println("第三趟排序后的数组"); System.out.println(Arrays.toString(arr));
for (int j = 0; j < arr.length - 4; j++) { if (arr[j] > arr[j + 1]) { temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } System.out.println("第四趟排序后的数组"); System.out.println(Arrays.toString(arr)); } }
|
运行结果
第一趟排序后的数组
[3, 5, 6, 0, 7]
第二趟排序后的数组
[3, 5, 0, 6, 7]
第三趟排序后的数组
[3, 0, 5, 6, 7]
第四趟排序后的数组
[0, 3, 5, 6, 7]
整合代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| package com.nanzx.sort;
import java.util.Arrays;
public class BubbleSort {
public static void main(String[] args) { int arr[] = { 6, 3, 5, 7, 0 }; System.out.println("排序前"); System.out.println(Arrays.toString(arr)); bubbleSort(arr); System.out.println("排序后"); System.out.println(Arrays.toString(arr)); }
public static void bubbleSort(int[] arr) { for (int n = 1; n < arr.length; n++) { int temp; for (int i = 0; i < arr.length - n; i++) { if (arr[i] > arr[i + 1]) { temp = arr[i]; arr[i] = arr[i + 1]; arr[i + 1] = temp; } } } } }
|
优化
如果我们发现在某趟排序中,没有发生一次交换,可以提前结束冒泡排序。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
| package com.nanzx.sort;
import java.util.Arrays;
public class BubbleSort {
public static void main(String[] args) { int arr[] = { 6, 3, 5, 7, 0 }; System.out.println("排序前"); System.out.println(Arrays.toString(arr)); bubbleSort(arr); System.out.println("排序后"); System.out.println(Arrays.toString(arr)); }
public static void bubbleSort(int[] arr) { boolean flag = false; for (int n = 1; n < arr.length; n++) { int temp; for (int i = 0; i < arr.length - n; i++) { if (arr[i] > arr[i + 1]) { flag = true; temp = arr[i]; arr[i] = arr[i + 1]; arr[i + 1] = temp; } } if (!flag) { break; } else { flag = false; } } } }
|
测试冒泡排序的速度O(n²)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
| package com.nanzx.sort;
import java.text.SimpleDateFormat; import java.util.Date;
public class BubbleSort {
public static void main(String[] args) {
int[] arr = new int[80000]; for (int i = 0; i < 80000; i++) { arr[i] = (int) (Math.random() * 8000000); }
Date data1 = new Date(); SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String date1Str = simpleDateFormat.format(data1); System.out.println("排序前的时间是=" + date1Str);
bubbleSort(arr);
Date data2 = new Date(); String date2Str = simpleDateFormat.format(data2); System.out.println("排序后的时间是=" + date2Str); }
public static void bubbleSort(int[] arr) { boolean flag = false; for (int n = 1; n < arr.length; n++) { int temp; for (int i = 0; i < arr.length - n; i++) { if (arr[i] > arr[i + 1]) { flag = true; temp = arr[i]; arr[i] = arr[i + 1]; arr[i + 1] = temp; } } if (!flag) { break; } else { flag = false; } } } }
|
排序前的时间是=2020-07-30 18:59:38 排序后的时间是=2020-07-30 18:59:50