冒泡排序的方式
简介
冒泡排序的实现方式为:从数组的第一个元素开始,依次比较相邻的两个元素的大小,将较大的元素向后移动。每一轮比较会确定一个当前未排序部分的最大值。(降序相反)
图解
以上是我们需要排序的七个数字
第一轮循环
第一步,比较2和8,得出8更大, 所以8在第二格
第二步,比较8和4,得出8更大,所以8在第三格
第三步,比较8和3,得出8更大,所以8在第四格
第四步,比较8和9,得出9更大,所以此时8不变
第五步,比较9和-1,得出9更大,所以9在第六格
第六步,比较9和7,得出9更大,所以9在第七格
以上,我们在第一次大循环中,总共循环了6次
第二轮循环
第一步,比较2和4,得出4更大,所以数组顺序保持不变
第二步,比较4和3,得出4更大,所以4到第三格
第三步,比较4和8,得出8更大,所以数组顺序保持不变
第四步,比较8和-1,得出8更大,所以8向后移到第五格
第五步,比较8和7,得出8更大,所以8向后移到第六格
由此可知这次循环总共要循环5次
后面的大循环
由上述循环可知,第三轮循环要循环4次,第四轮循环要循环3次,第五轮循环要循环2次,第六轮循环要循环1次。
所以外轮循环总共要循环6次,即(总长度-1)次
代码
关键代码段:
//冒泡排序
for(int j=0;j<len-1;j++){ //外层循环,根据上述对方式的描述可知,总共要循环(总长度-1)次(因为数组从0开始计数)
for(int i=0;i<len-1-j;i++){//内层循环,每轮循环的次数为外层循环次数的倒序
if(a[i]>a[i+1]){
int max=a[i];//将更大的值赋给max
a[i]=a[i+1];//将小值移到前面一格
a[i+1]=max;//将更大的值移到后面一格
}
}
}
总代码:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(){
//随机生成数组
int len,k=0,i=0;
printf("请输入数组长度:");
scanf("%d",&len);
int a[len];
srand(time(NULL));
for(i=0;i<len;++i){
a[i]=rand()%100;
}
//输出生成的数组
for(i=0;i<len;i++){
printf("%d\t",a[i]);
}
//冒泡排序
for(int j=0;j<len-1;j++){
for(int i=0;i<len-1-j;i++){
if(a[i]>a[i+1]){
int max=a[i];
a[i]=a[i+1];
a[i+1]=max;
}
}
}
//输出排序结果
for(i=0;i<len;i++){
printf("%d\t",a[i]);
}
输出结果展示: