营养小代码之排序

        排序对于数据处理来说很常见,冒泡排序容易理解,使用方便,很有必要掌握.

        以升序为例,每一轮从头开始,判定相邻的两个数,如果前一个大于后一个则交换两个的值,每一轮就会有一个最大的值放到了最后,所以下一轮可以减少一次比较,因为每次都是两个两个比较,所以,排序的总趟数比排列数的总个数少一.简单的讲,就是每一轮都选出所有参与排序的数的最大值放在最后.

         直接来代码.排列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);
}

有上述代码中使用的三目运算符很是简洁高效

这次排序就讲到这里,下次继续

                 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

定风啵

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值