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 }

 

posted @ 2025-11-23 22:01  ywaanig  阅读(3)  评论(0)    收藏  举报