Java中冒泡排序的优化方法
1. 引言
冒泡排序(Bubble Sort)是一种简单的排序算法,它通过重复地遍历待排序的列表,比较相邻的元素并交换它们的位置来实现排序。该算法的名称来源于较小的元素会像"气泡"一样逐渐"浮"到列表的顶端。
2. 算法步骤
比较相邻元素:从列表的第一个元素开始,比较相邻的两个元素。
交换位置:如果前一个元素比后一个元素大,则交换它们的位置。
重复遍历:对列表中的每一对相邻元素重复上述步骤,直到列表的末尾。这样,最大的元素会被"冒泡"到列表的最后。
3. 基础实现
1 private static int[] bubbleSort(int[] arr) { 2 int temp; 3 for (int i = 0; i < arr.length - 1; i++) { 4 for (int j = 0; j < arr.length - 1 - i; j++) { 5 if (arr[j + 1] < arr[j]) { 6 temp = arr[j]; 7 arr[j] = arr[j + 1]; 8 arr[j + 1] = temp; 9 } 10 } 11 } 12 return arr; 13 }
4. 优化方法
4.1 添加标志位优化
1 private static int[] bubbleSortOptimized(int[] arr) { 2 int temp; 3 boolean swapped; 4 for (int i = 0; i < arr.length - 1; i++) { 5 swapped = false; 6 for (int j = 0; j < arr.length - 1 - i; j++) { 7 if (arr[j + 1] < arr[j]) { 8 temp = arr[j]; 9 arr[j] = arr[j + 1]; 10 arr[j + 1] = temp; 11 swapped = true; 12 } 13 } 14 // 如果这一轮没有发生交换,说明已经有序 15 if (!swapped) break; 16 } 17 return arr; 18 }
4.2 记录最后交换位置优化
1 private static int[] bubbleSortAdvanced(int[] arr) { 2 int temp; 3 int lastSwapIndex = arr.length - 1; 4 int currentSwapIndex; 5 6 for (int i = 0; i < arr.length - 1; i++) { 7 currentSwapIndex = -1; 8 for (int j = 0; j < lastSwapIndex; j++) { 9 if (arr[j + 1] < arr[j]) { 10 temp = arr[j]; 11 arr[j] = arr[j + 1]; 12 arr[j + 1] = temp; 13 currentSwapIndex = j; 14 } 15 } 16 // 如果这一轮没有交换,提前结束 17 if (currentSwapIndex == -1) break; 18 // 记录最后一次交换的位置,后面的已经有序 19 lastSwapIndex = currentSwapIndex; 20 } 21 return arr; 22 }
4.3 鸡尾酒排序(双向冒泡)
1 private static int[] cocktailSort(int[] arr) { 2 int temp; 3 int left = 0; 4 int right = arr.length - 1; 5 6 while (left < right) { 7 boolean swapped = false; 8 9 // 从左到右 10 for (int i = left; i < right; i++) { 11 if (arr[i] > arr[i + 1]) { 12 temp = arr[i]; 13 arr[i] = arr[i + 1]; 14 arr[i + 1] = temp; 15 swapped = true; 16 } 17 } 18 right--; 19 if (!swapped) break; 20 21 swapped = false; 22 // 从右到左 23 for (int i = right; i > left; i--) { 24 if (arr[i] < arr[i - 1]) { 25 temp = arr[i]; 26 arr[i] = arr[i - 1]; 27 arr[i - 1] = temp; 28 swapped = true; 29 } 30 } 31 left++; 32 if (!swapped) break; 33 } 34 return arr; 35 }
4.4 综合优化版本(标志位优化 +记录最后交换位置优化)
1 private static int[] bubbleSortUltimate(int[] arr) { 2 if (arr == null || arr.length <= 1) return arr; 3 4 int temp; 5 int lastSwapIndex = arr.length - 1; 6 int currentSwapIndex; 7 8 for (int i = 0; i < arr.length - 1; i++) { 9 currentSwapIndex = -1; 10 boolean swapped = false; 11 12 for (int j = 0; j < lastSwapIndex; j++) { 13 if (arr[j] > arr[j + 1]) { 14 // 交换元素 15 temp = arr[j]; 16 arr[j] = arr[j + 1]; 17 arr[j + 1] = temp; 18 19 swapped = true; 20 currentSwapIndex = j; 21 } 22 } 23 24 // 如果没有交换,提前结束 25 if (!swapped) break; 26 // 更新最后交换位置 27 if (currentSwapIndex >= 0) { 28 lastSwapIndex = currentSwapIndex; 29 } 30 } 31 return arr; 32 }

浙公网安备 33010602011771号