💀内卷起来😏💀
分析:用双重循环实现冒泡排序,外层循环控制轮数与元素个数有关,即n个元素需要n-1轮。内层循环控制需要比较的相邻元素个数,与外层循环的轮数有关,即第i轮(i=1,i=n-1)时,内层需要比较n-i对相邻元素,当轮数增大时,已经找到位置的元素个数随之增大,那么内层待比较元素的对数随之减少。
步骤:
- 比较相邻两个数的大小,如果第二个数小就交换
- 从前往后依次比较,每一轮最后一组比较完成后,最大数会排在末尾
- 重复上述过程
动态图解:
void BubbleSort(int r[],int n){
int i,j,t;
for(i=1,i<=n-1:i++){//控制轮数
for(j=0;j<=n-1-i;j++){//每一轮对无序元素比较次数
if(r[j]>r[j+1]){//如果前面数大于后面数就交换
t=r[j];
r[j]=r[j+1];
r[j+1]=t;
}
}
}
}
😂前面所用的冒泡排序不论情况好坏,都要进行n-1轮,如果到第i轮已经排好就不需要进行下一轮了,所以上面的冒泡排序是可以改进的。
- 优化;
void BubbleSort(int r[],int n){
//设置swapflag为某轮是否有元素的标记,有交换为1没有为0
//为保证第一轮必须扫描,所以它的初始值为1
int swaplfag=1;
for(int i=1;swapflag && i<n;i++){
swapflag=0;//开始为0
for(int j=0;j<=n-1-i;j++){
if(r[j]>r[j+1]){
int t=r[j];
r[j]=r[j+1];
r[j+1]=t;
swapflag=1;//设置成有元素交换的值
}
}
}
}
平均时间复杂度:O(n²)
空间复杂度:O(1)
稳定性:冒泡排序是稳定算法