排序算法00_冒泡排序

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次\n",y);
31     printf("外循环执行了%d次\n",x);
32 }

执行结果为

这样效果不是特别明显,换一组数据测试一下,数组序列为{2,0,1,3,4,5,6,7,8,9}

 

效果很明显

 

posted @ 2018-07-14 13:02  张子游zy  阅读(153)  评论(0编辑  收藏  举报