1、普通冒泡排序
1 //冒泡排序
2 #include<stdio.h>
3 int main(){
4 int a[10],i,j,t;
5 printf("enter 10 numbers:");
6 for(i=0;i<10;i++){
7 scanf("%d",&a[i]);
8 }
9 //数组中有n个数,依次找出n-1个较大数,所以外层循环的循环次数为n-1
10 for(i=0;i<9;i++){
11 //每一轮比较中,共进行j次比较,j从0开始循环,第0次循环(n-1)-0次;
12 //第1次循环(n-1)-1次;第i次循环,循环(n-1)-i次
13 for(j=0;j<9-i;j++){
14 //如果前一个数a[j]比后一个数a[j+1]大,则交换两个数
15 if(a[j]>a[j+1]){
16 t=a[j+1];a[j+1]=a[j];a[j]=t;
17 }
18 }
19 }
20 printf("the sorted numbers:");
21 for(i=0;i<10;i++){
22 printf("%3d",a[i]);
23 }
24 return 0;
25 }
2、冒泡排序的优化一
在一个未排序的数列中,可能不需要执行完全部的排序过程,数列就已经有序了,后面的排序过程也不用执行了,这样会节省很多计算机资源。
1 //冒泡排序的优化一
2 #include<stdio.h>
3 int main(){
4 void sort(int array[],int n);
5 int array[10]={12,34,54,21,88,3,5,98,1,9}; 6 int n=10;
7 sort(array,n);
8 for(int i=0;i<10;i++)
9 printf("%d ",array[i]);
10 }
11 void sort(int array[],int n){
12 int temp;
13 //定义变量x来测试外循环执行了多少次,y测试内循环执行了多少次
14 int x=0,y=0;
15 //设置标志变量flag来判断数列是否已经有序,如果数列已经有序,则不需要再执行排序步骤,节省资源开销
16 int flag=1;
17 for(int i=0;i<n-1&&flag;i++){
18 //循环开始时将flag置为0,如果有任意两个数位置发生了交换,执行交换语句的同时也使flag置为1,下次继续进行排序;
19 //如果交换语句没有执行,则证明数列中任何两个数字之间没有逆序,flag为0,排序过程不再执行
20 flag=0;
21 for(int j=0;j<n-1-i;j++){
22 if(array[j]>array[j+1]){
23 temp=array[j];array[j]=array[j+1];array[j+1]=temp;
24 flag=1;
25 ++y;
26 }
27 }
28 ++x;
29 }
30 printf("内循环执行了%d次
",y);
31 printf("外循环执行了%d次
",x);
32 }
执行结果为
这样效果不是特别明显,换一组数据测试一下,数组序列为{2,0,1,3,4,5,6,7,8,9}
效果很明显