冒泡排序及其复杂度
Posted Vincent(朱志强)
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了冒泡排序及其复杂度相关的知识,希望对你有一定的参考价值。
冒泡排序
什么是冒泡排序
冒泡排序算法通过不断比较和交换(如有必要)数据集相邻的两个元素,直到他们有序为止。
就像水底的气泡往水面上浮动一样,每一轮的比较和交换都会从无序区域浮出一个最大数,抵达有序区域的起始位置。
假定我们现在要按照升序对一个数组进行排序。数组为:[-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)
//检验入参,如果数组为null或元素小于两位,则无需比较
if (numbers == null || numbers.length < 2)
return;
//轮数,总共需要n-1轮比较和交换,n-1个数都位于正确位置了,最后一个自然也就位了
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) | 稳定 |
以上是关于冒泡排序及其复杂度的主要内容,如果未能解决你的问题,请参考以下文章