冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法。它的基本思想是:对所有相邻记录的关键字进行比较,若不满足要求(升序或逆序),则将其交换,直到所有记录排好为止
冒泡排序一般来说就是从左往右扫描数据,选择最大的数据,放在右边;冒泡排序是一种稳定的排序方法
,关键字的比较次数和记录的交换次数与记录的初始顺序有关
要点: 比较相邻的两个数,如果左边的数大于右边的数,就进行交换
测试用例: 使用冒泡排序算法将数组 数组 { 4,2,8,0,5,7,1,3,6,9 } 进行升序排序
代码实现
/**
* 冒泡排序
* 最好情况的时间复杂度是O(n),也就是只出现外循环的情况
* 最坏的情况时间复杂度是O(n^2),也就是外循环次数与内循环次数递减相乘
* 空间复杂度为O(1),因为需要一个记录大小的辅助空间用于交换temp
* @param nums 数组
* @param size 数组大小
* @return 返回排列好的数组
*/
public int[] bubbleSort(int[] nums, int size) {
int i, j;
int temp;
boolean flag = true; // 用来判断是否已经完成循环,不需要再比较
for (i = 1; i < size && flag; i++) { // 外循环,循环数组列表
// 每次外循环终会有一个元素已经被排好,所以每次内循环比较的次数是size-i
flag = false; // 每次比较进行初始化flag标志,true意味着还需要循环,false不需要再循环
for (j = 0; j < size-i; j++) {
if (nums[j+1] < nums[j]){
temp = nums[j]; // temp用来存放比较大的元素
nums[j] = nums[j+1]; // 按照小的在前,大的在后,交换元素顺序
nums[j+1] = temp;
flag = true; // 如果出现了交换操作,修改flag为true
}
}
}
return nums;
}
时间复杂度
最好的情况是,初始序列有序,比较次数为n-1,交换次数为0,因此最好情况的时间复杂度为
O
(
n
)
O(n)
O(n);最坏情况是,初始序列为逆序,比较次数和交换次数均为:
n
(
n
−
1
)
/
2
n(n-1)/2
n(n−1)/2 =
1
2
n
2
\frac{1}{2}n^2
21n2 -
1
2
n
\frac{1}{2}n
21n =
∑
i
=
1
n
−
1
(
n
−
i
)
\sum_{i=1}^{n-1} (n-i)
i=1∑n−1(n−i),因此最坏情况时间复杂度为
O
(
n
2
)
O(n^2)
O(n2)
空间复杂度
在冒泡排序过程中,只需要一个记录大小的辅助空间用于交换,因此空间复杂度为O(1)