冒泡排序
2024年1月11日大约 2 分钟
冒泡排序
冒泡排序(Bubble Sort)是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。
算法描述
- 从数列中挑出最小(大)元素,依次放到数列的起始位置;
- 再从剩下的元素中挑出最小(大)元素,放到已排序序列的末尾;
- 重复步骤2,直到所有元素排序完成。
示例
对数列 {5, 3, 8, 6, 4} 进行冒泡排序:
第一轮:
- 比较5和3,发现5>3,交换位置,数列变成 {3, 5, 8, 6, 4};
- 比较5和8,发现5<8,位置不变,数列还是 {3, 5, 8, 6, 4};
- 比较8和6,发现8>6,交换位置,数列变成 {3, 5, 6, 8, 4};
- 比较8和4,发现8>4,交换位置,数列变成 {3, 5, 6, 4, 8};
第一轮结束,此时最大元素8已经排好序,接下来对剩下的数列 {3, 5, 6, 4} 进行冒泡排序。
第二轮:
- 比较3和5,发现3<5,位置不变,数列还是 {3, 5, 6, 4};
- 比较5和6,发现5<6,位置不变,数列还是 {3, 5, 6, 4};
- 比较6和4,发现6>4,交换位置,数列变成 {3, 5, 4, 6};
第二轮结束,此时次大元素6已经排好序,剩下的数列 {3, 5, 4} 继续冒泡排序。
第三轮:
- 比较3和5,发现3<5,位置不变,数列还是 {3, 5, 4};
- 比较5和4,发现5>4,交换位置,数列变成 {3, 4, 5};
第三轮结束,此时第三大元素5已经排好序,剩下的数列 {3, 4} 继续冒泡排序。
第四轮:
- 比较3和4,发现3<4,位置不变,数列还是 {3, 4};
第四轮结束,此时最小元素3已经排好序,整个数列排序完成。
复杂度分析
- 最好情况:当数组已经按照排序需求排好时,只需进行一次遍历,时间复杂度为O(n);
- 最坏情况:当数组是逆序排列时,需要进行n-1次遍历,时间复杂度为O(n^2);
- 平均情况:需要进行n-1次遍历,时间复杂度为O(n^2)。
冒泡排序是一种稳定的排序算法。
public class bubbleSort {
public static void bubbleSort(int[] arr) {
int n = arr.length;
for (int i = 0; i < n-1; i++) {
for (int j = 0; j < n-i-1; j++) {
if (arr[j] > arr[j+1]) {
// 交换arr[j]和arr[j+1]
int temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
}
}