本模块是公共类课程,适合绝大部分计算机岗位。由于 Java 受众最广且易读性强,本模块示例代码使用 Java 编写,其他语言也可参考学习。
冒泡排序原理
冒泡排序是一种简单的排序算法,主要思想是从头到尾依次比较相邻的两个元素,如果逆序则交换,直到没有逆序的元素为止。
冒泡排序的时间复杂度是 O(n^2),空间复杂度是 O(1)。
冒泡排序实现
如,对数组arr = [5, 3, 8, 6, 4]
进行升序冒泡排序。
设置end
指向数组末尾,每一轮比较结束后,end--
,或者说,end = arr.length - 轮数 - 1
。
每一轮让指针cur
指向数组第 0 个元素,然后依次比较。
最后设置一个标志位flag
,每一轮都初始化为false
,如果某一轮没有发生交换,则说明数组已经有序,直接跳出循环。
排序过程如下:
第一轮
5 3 8 6 4 cur next arr[cur] > arr[next]
,交换位置,flag = true
3 5 8 6 4 cur next arr[cur] < arr[next]
,不交换位置3 5 8 6 4 cur next arr[cur] > arr[next]
,交换位置3 5 6 8 4 cur next arr[cur] > arr[next]
,交换位置3 5 6 4 8 cur cur
位于end
位置,跳出循环,end--
第二轮
3 5 6 4 8 cur next arr[cur] < arr[next]
,不交换位置3 5 6 4 8 cur next arr[cur] < arr[next]
,不交换位置3 5 6 4 8 cur next arr[cur] > arr[next]
,交换位置,flag = true
3 5 4 6 8 cur cur
位于end
位置,跳出循环,end--
第三轮
3 5 4 6 8 cur next arr[cur] < arr[next]
,不交换位置3 5 4 6 8 cur next arr[cur] > arr[next]
,交换位置,flag = true
3 4 5 6 8 cur cur
位于end
位置,跳出循环,end--
第四轮
3 4 5 6 8 cur next arr[cur] < arr[next]
,不交换位置3 4 5 6 8 cur cur
位于end
位置,跳出循环。这一轮
flag = false
,说明数组已经有序,提前结束排序
冒泡排序代码实现
public void bubbleSort(int[] nums) {
int n = nums.length;
for (int i = 0; i < n - 1; i++) {
boolean flag = false;
for (int j = 0; j < n - i - 1; j++) {
if (nums[j] > nums[j + 1]) {
int temp = nums[j];
nums[j] = nums[j + 1];
nums[j + 1] = temp;
// 支持元祖的编程语言可以写成 (nums[j], nums[j + 1]) = (nums[j + 1], nums[j]);
flag = true;
}
}
if (!flag) {
break;
}
}
}