详细步骤:
package com.company; import java.util.Arrays; public class Main { public static void main(String[] args) { int arr[] = {3,9,-1,10,-2}; int temp = 0; for (int i = 0; i < arr.length - 1; i++) { if (arr[i] > arr[i + 1]){ temp = arr[i]; arr[i] = arr[i + 1]; arr[i + 1] = temp; } } System.out.println("第一遍排序后的结果"); System.out.println(Arrays.toString(arr)); for (int i = 0; i < arr.length - 2; i++) { if (arr[i] > arr[i + 1]){ temp = arr[i]; arr[i] = arr[i + 1]; arr[i + 1] = temp; } } System.out.println("第二遍排序后的结果"); System.out.println(Arrays.toString(arr)); for (int i = 0; i < arr.length - 3; i++) { if (arr[i] > arr[i + 1]){ temp = arr[i]; arr[i] = arr[i + 1]; arr[i + 1] = temp; } } System.out.println("第三遍排序后的结果"); System.out.println(Arrays.toString(arr)); for (int i = 0; i < arr.length - 4; i++) { if (arr[i] > arr[i + 1]){ temp = arr[i]; arr[i] = arr[i + 1]; arr[i + 1] = temp; } } System.out.println("第四遍排序后的结果"); System.out.println(Arrays.toString(arr)); for (int i = 0; i < arr.length - 5; i++) { if (arr[i] > arr[i + 1]){ temp = arr[i]; arr[i] = arr[i + 1]; arr[i + 1] = temp; } } System.out.println("第五遍排序后的结果"); System.out.println(Arrays.toString(arr)); } }
优化后的算法:
package com.company; import java.util.Arrays; public class Main { public static void main(String[] args) { // int arr[] = {3,9,-1,10,20}; int[] arr = {1,2,3,4,5,6,7}; int temp = 0; boolean flag = false;// 标识变量,表示是否进行过交换 // 冒泡排序 的时间复杂度 O(n^2) for (int i = 0; i < arr.length - 1; i++) { for (int j = 0; j < arr.length - 1 - i; j++) { if (arr[j] > arr[j + 1]){ flag = true; temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } System.out.println("第" + (i + 1) + "遍排序后的结果"); System.out.println(Arrays.toString(arr)); if (!flag){ // 在一趟排序中,一次交换都没有发生过 break; }else { flag = false; // 重置 flag!!!, 进行下次判断 } } } }
加入时间记录后:
package com.company; import java.text.SimpleDateFormat; import java.util.Arrays; import java.util.Date; public class Main { public static void main(String[] args) { int n = 80000; int[] arr = new int[n]; for (int i = 0; i < n; i++) { arr[i] = (int) (Math.random() * n); } System.out.println(Arrays.toString(arr)); Date date = new Date(); SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String dateStr = simpleDateFormat.format(date); System.out.println("排序前的时间" + dateStr); long l1 = System.currentTimeMillis(); bubbleSort(arr); System.out.println("排序后的数组"); Date date2 = new Date(); String date2Str = simpleDateFormat.format(date2); System.out.println("排序后的时间" + date2Str); long l2 = System.currentTimeMillis(); l2 = (l2 - l1) / 1000; System.out.println("总共耗费的时间" + l2 + "" + "秒"); } public static void bubbleSort(int[] arr) { int temp = 0; boolean flag = false;// 标识变量,表示是否进行过交换 // 冒泡排序 的时间复杂度 O(n^2) for (int i = 0; i < arr.length - 1; i++) { for (int j = 0; j < arr.length - 1 - i; j++) { if (arr[j] > arr[j + 1]) { flag = true; temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } // System.out.println("第" + (i + 1) + "遍排序后的结果"); // System.out.println(Arrays.toString(arr)); if (!flag) { // 在一趟排序中,一次交换都没有发生过 break; } else { flag = false; // 重置 flag!!!, 进行下次判断 } } } }