冒泡排序解析:
我们先来定义一个数组arr[5],元素分别是{10,9,5,4,3},冒泡排序的“冒泡”就是将数字小的排到顶部,将数字大的沉底。
第零趟 | 第一趟 | 第二趟 | 第三趟 | 第四趟 |
10 | 9 | 5 | 4 | 3 |
9 | 5 | 4 | 3 | 4 |
5 | 4 | 3 | 5 | 5 |
4 | 3 | 9 | 9 | 9 |
3 | 10 | 10 | 10 | 10 |
以第零趟与第一趟之间举例:
第零轮 | 第一轮 | 第二轮 | 第三轮 | 第四轮 |
10 | 9 | 9 | 9 | 9 |
9 | 10 | 5 | 5 | 5 |
5 | 5 | 10 | 4 | 4 |
4 | 4 | 4 | 10 | 3 |
3 | 3 | 3 | 3 | 10 |
第一轮排序将第一位“10”和第二位“9”比较,“10”沉底。第一轮比较时第一位变成“9”,第二位变成“10”。
第二轮排序将第二位“10”与第三位“5”比较,“10”沉底。第二轮比较时第二位变成“5”,第三位变成“10”。
第三轮与第四轮同上,依次进行第三四位和四五位的比较,这样我们就完成了“第一趟”排序,此时我们知道第五位数字是数组中最大的,那么我们就不需要对四五位进行比较了。
第一趟排序得知第五位最小,那么第一趟与第二趟之间四五位不需要比较,一共三轮。
第二趟排序得知第四五位最小,那么第二趟与第三趟之间四五位和三四位不需要比较,一共两轮。
代码展示:
#include<stdio.h>
int main(){
int arr[5]={10,9,5,4,3};
int i=0,n=0,t=0;//定义一个替换变量t
for(i=0;i<4;i++){//趟数
for(n=0;n<4-i;n++){//轮数(每一趟就会少一个对比的数)
if(arr[n]>arr[n+1]){//设立判断条件,决定升序还是降序
t=arr[n+1];
arr[n+1]=arr[n];
arr[n]=t;
}
}
}
for(i=0;i<5;i++){
printf("%d ",arr[i]);//输出看下结果
}
}
我们看一下输出结果:
冒泡排序规律:
冒泡序列大致分为三层:(假设一共排序x位数字)
第一层:一共进行几趟排序(趟数i=x-1次)
第二层:趟与趟之间进行几轮比较(轮数n=x-1-i次)
第三层:判断条件,决定升降序。(需要引入一个替代变量)
冒泡排序的情况:
1.函数形式:
比较十个数的大小,并将他们由小到大排序。
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int function(arr[],size){
int i,n,x,num;
size=sizeof(arr)/sizeof(arr[0]);
for(i=0;i<size-1;i++){
for(n=0;n<size-1-i;n++){
if(arr[n]>arr[n+1]){
x=arr[n+1];
arr[n+1]=arr[n];
arr[n]=x;
num=1;
}
if(num==0){
break;//如果没有排序就说明排序完毕
}
}
}
}
int main(){
int x,y,z;
int arr[10]={0};
for(z=0;z<10;z++){
scanf("%d",&arr[z]);//给数组arr输入10个数字
}
function(arr[10],x);//调用function函数
for(y=0;y<10;y++){//打印排序好的数组
printf("%d ",arr[y]);
}
return 0;
}