什么是冒泡排序
冒泡排序算法通过不断比较和交换(如有必要)数据集相邻的两个元素,直到他们有序为止。
就像水底的气泡往水面上浮动一样,每一轮的比较和交换都会从无序区域浮出一个最大数,抵达有序区域的起始位置。
假定我们现在要按照升序对一个数组进行排序。数组为:[-2,45,0,11,-9]
。
冒泡排序工作机制
首轮(第0轮)比较和交换
在首轮比较和交换前,无序区域是整个数组,有序区域为空集。
- 比较无序区域的第一个和第二个元素,示例数组中为-2和45。
- 如果前者大于后者,那么交换它们的位置。
- 继续比较第二元素和第三个元素,如果前者大于后者,交换它们的位置。
- 上述过程持续到倒数第二个元素和最后一个元素的比较和交换。
第0轮 |
---|
|
重复上述过程,继续比较和交换
第1轮 |
---|
|
第2轮 |
---|
|
第3轮 |
---|
|
每一轮下来,比较和交换都是从无序区域的第一个元素开始,最后一个元素结束。如此这般,无序数组的最大的一个元素放到了无序数组的结尾,也就成了新的有序数组的开头。重复这个过程,直至所有元素都处于正确的位置。
伪代码
bubbleSort(array)
swapped <- false
for i <- 1 to indexOfLastUnsortedElement-1
if leftElement > rightElement
swap leftElement and rightElement
swapped <- true
end bubbleSort
java实现
public static void bubbleSort(int[] numbers) {
if (numbers == null || numbers.length < 2) {
return;
}
for (int round = 0; round < numbers.length - 1; round++) {
boolean swapped = false;
for (int index = 0; index < numbers.length - round - 1; index++) {
if (numbers[index] > numbers[index + 1]) {
int temp = numbers[index];
numbers[index] = numbers[index + 1];
numbers[index + 1] = temp;
swapped = true;
}
}
if (!swapped) {
return;
}
}
}
复杂度及稳定性
时间复杂度 | 空间复杂度 | 稳定性 |
---|
最好
O
(
n
)
O(n)
O(n)最差
O
(
n
2
)
O(n^2)
O(n2)平均
O
(
n
2
)
O(n^2)
O(n2) |
O
(
1
)
O(1)
O(1) | 稳定 |