题目:
实现冒泡排序
解题思路:
1、冒泡排序的过程:以实现结果为从大到小的排序为例,从左往右依次进行比较,如果左右两个数不满足左边的数大于右边的数,那么交换两个数,然后接着进行比较到结尾。第一轮排序将最小的一个数排到末尾,第二轮将次小的一个数排到倒数第二个位置,以此类推......
2、根据对冒泡排序过程的描述,可以知道每一轮进行比较的次数依次减少。
3、下面给出一个例子来演示冒泡排序的过程(排序结果由大到小):
示例: 45 32 11 25 68
第一轮:45 32 25 68 11
第二轮:45 32 68 25 11
第三轮:45 68 32 25 11
第四轮:68 45 32 25 11
程序代码:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(int argc, char *argv[])
{
srand(time(NULL));
int a[5],t,n = 1;
for(int i = 0; i < 5; i++){
a[i] = rand()%100;//为数组随机赋值
printf("%d ",a[i]);//显示排序之前数组的值
}
puts("");
for(int i = 0; i < 5 - 1; i++){//排序的轮数
n = 1;//重置n
for(int j = 0; j < 5 - i -1; j++){//每次排序的次数
if(a[j] < a[j+1]){
t = a[j];
a[j] = a[j+1];
a[j+1] = t;
n = 0;//如果发生了交换,就证明本轮没有完成排序
}
}
if(n == 1){ //此时,n = 1证明这一轮中都没有发生过交换,那么可知此时值是有序的
for(int i = 0; i < 5; i++){
printf("%d ",a[i]);//提前输出
}
return 0;//提前结束
}
}
for(int i = 0; i < 5; i++){
printf("%d ",a[i]);
}
return 0;
}
运行结果:
74 18 29 93 3
93 74 29 18 3
3 1 55 51 73
73 55 51 3 1
88 68 37 91 96
96 91 88 68 37