排序对于数据处理来说很常见,冒泡排序容易理解,使用方便,很有必要掌握.
以升序为例,每一轮从头开始,判定相邻的两个数,如果前一个大于后一个则交换两个的值,每一轮就会有一个最大的值放到了最后,所以下一轮可以减少一次比较,因为每次都是两个两个比较,所以,排序的总趟数比排列数的总个数少一.简单的讲,就是每一轮都选出所有参与排序的数的最大值放在最后.
直接来代码.排列int num[n]
<span style="background-color: rgb(204, 204, 204);"> for(int i=0;i<n-1;i++){<span style="color:#33cc00;">//n-1轮</span>
for(int j=0;j<n-1-i;j++){<span style="color:#33cc00;">//每轮n-1-i次</span>
<span style="color:#cc9933;">if(num[j]>num[j+1]){</span><span style="color:#33cc00;">//大于则交换</span><span style="color:#cc9933;">
int t=num[j];
num[j]=num[j+1];
num[j+1]=t;</span>
<span style="color:#ff9900;">}</span>
}
}</span>
冒泡排序几乎适用于所有数据类型的排序,只要改变上述代码暗黄色部分的代码就可以
实例1;电脑随机产生5种票,分别表示选举A,B,C,D和弃权,统计A,B,C,D的获奖情况并排序
(不使用结构体)
void fun3(int n){
char per[4]={'A','B','C','D'};
int tickets[4]={0};
int g=0;<span style="color:#33cc00;">//弃权票</span>
for (int i=0; i<n; i++) {
int t=arc4random()%5;<span style="color:#33cc00;">//用随机数模拟投票</span>
switch (t) {
case 0:tickets[0]++;break;
case 1:tickets[1]++;break;
case 2:tickets[2]++;break;
case 3:tickets[3]++;break;
default:g++;
break;
}
}
for(int i=0;i<3;i++){
for(int j=0;j<3-i;j++){
<pre name="code" class="cpp"><span style="color:#cc9933;">for(int i=0;i<3;i++){
for(int j=0;j<3-i;j++){
if(tickets[j]<tickets[j+1]){
int t=tickets[j];
tickets[j]=tickets[j+1];
tickets[j+1]=t;
char tt=per[j];
per[j]=per[j+1];
per[j+1]=tt;
}
}
}</span>
} }
printf("\n %c--%d",per[0],tickets[0]);
for(int i=1;i<4;i++){//保证相同分数可以并排名次
if(tickets[i]==tickets[i-1]){
printf(" %c--%d",per[i],tickets[i]);
}else{
printf("\n %c--%d",per[i],tickets[i]);
}
}
}
(使用结构体),声明结构体和结构体数组,交换部分代码如下
struct MyPer{
char name;
int tickets;
} ;
typedef struct MyPer MyPer;
MyPer per[4]={{'A',0},{'B',0},{'C',0},{'D',0}};
<pre name="code" class="cpp"><span style="color:#cc9933;">if(per[j].tickets<per[j+1].tickets){
MyPer t=per[j];
per[j]=per[j+1];
per[j+1]=t;
}</span>
冒泡排序是重量级的排序,还有轻量级的,使用三目判断符比较两个数的轻量级代码,在解决一些特定的问题有奇效
//4. (***)输入两个数,求最大公约数和最小公倍数。(用两种方法:辗转相除法和普通方法)
void fun4_1(){
int a=52;
int b=39;
printf("\n4.(辗转相除法)用户输入a=%d,b=%d",a,b);
<span style="color:#cc9933;">int max=a>b?a:b;
int min=a<b?a:b;
int r=max%min;
while (r) {
max=min;
min=r;
r=max%min;
}</span>
printf("\n最大公约数:%d 最小公倍数:%d ",min,a*b/min);
}
void fun4_2(){
int a=52;
int b=39;
printf("\n4.(循环寻找法)用户输入a=%d,b=%d",a,b);
<span style="color:#cc9933;">int max=a>b?a:b;</span>
int r=0;
for(int i=1;i<max;i++){
if(a%i==0&&b%i==0){
r=i;
}
}
printf("\n最大公约数:%d 最小公倍数:%d ",r,a*b/r);
}
有上述代码中使用的三目运算符很是简洁高效
这次排序就讲到这里,下次继续