一、冒泡概念
冒泡排序是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。
时间复杂度:O(n^2)
空间复杂度:O(1)
稳定性:稳定
二、算法描述
1、i从0开始,i与i+1比较,如果i>i+1,那么就互换。
2、i不断增加,直到i<n-1(n是数组元素的个数,n-1是数组已经最后一个元素) ,一趟下来,可以让数组元素中最大值排在数组的最后面。
3、两个元素需要比较一趟,n个元素就比较n-1趟,所以重复1~2步骤n-1趟。
三、伪代码描述
public class Main{
/**
比较类冒泡排序
*/
public void bubbleSort(int num[]){
//外循环控制排序的趟数,n为num的元素个数
for(int i = 0; i < n-1; i++){
//内循环控制遍历比较的元素:0~n-2,因为有num[j]与num[j + 1]比较
//比较完一趟,最后一个元素肯定最大或最小,不用再比较了,所以n-1再减i。
for(int j = 0; j < n-1-i; j ++){
///判断相邻元素,前一个比后一个大或者小,交换元素位置。
}
}
}
}
四、代码实现
public class Main{
/**
比较类冒泡排序
*/
public void bubbleSort(int num[]){
//外循环控制排序的趟数,n为num的元素个数
for(int i = 0; i < n-1; i++){
//内循环控制遍历比较的元素
for(int j = 0; j < n-1-i; j ++){
//判断相邻元素
if(num[j] > num[j + 1]){ //当两个元素相等时不改变顺序,排序稳定
//交换元素
int temp = num[j + 1];
num[j + 1] = num[j];
num[j] = temp;
}
}
}
}
}
五、冒泡排序优化
- 问题描述:如果在第一趟排完序后数组就已经是排好了,那后面的多趟遍历比较就没意义了。
- 问题解决:如果在某躺排序中没有发生一次元素交换位置,那么我们可以认为该数组已经排好序了。(在每一趟排序前重置一个Boolean变量,在交换元素后立即将变量置为true,每一趟排序后判断该变量是否变为true,没有就break结束排序)
public class Main{
/**
比较类冒泡排序
*/
public void bubbleSort(int num[]){
//外循环控制排序的趟数,n为num的元素个数
for(int i = 0; i < n-1; i++){
//一趟中有没有元素改变
Boolean isChange = false;
//内循环控制遍历比较的元素
for(int j = 0; j < n-1-i; j ++){
//判断相邻元素
if(num[j] > num[j + 1]){ //当两个元素相等时不改变顺序,排序稳定
//交换元素
int temp = num[j + 1];
num[j + 1] = num[j];
num[j] = temp;
//交换了元素
isChange = true;
}
}
//一趟结束后判断有没有改变元素位置
if(isChange == false){
//已经排好序了
break;
}
}
}
}