C语言最常用的2种排序方法

        在实际问题中,我们经常要收集数据,但是数据并不都是按照一定顺序排列完善的,所以有时候对于数据排序是十分必要的,有时候数据必须要排好顺序之后才能进行后续的工作。这一节就简单介绍一下C语言中对于一些数据按照从大到小或者从小到大的顺序排列的方法(小白友好),这里用到的一些知识有:基本的print函数、scanf函数、数组基础、for循环等相关知识。

1.选择排序法:

我们先给出代码:(此例子是从大到小排列)

#include <stdio.h>
int main () {
   int a[10];
   int iTemp,iPos; //iTemp是暂时存放数据的变量、
                    //iPos是表示数据位置的变量
   for(int i=0;i<10;i++)//for循环输入数据
   {
       printf("a[%d]=",i);
       scanf("%d",&a[i]);
   }
   for(int i=0;i<9;i++)//第一层循环
   {
       iTemp=a[i];//先将第一个数组单元的数据和位置
       iPos=i;    //赋给我们定义的两个变量
       for(int j=i+1;j<10;j++)
       {
           if(a[j]>iTemp)//开始进行逐个对比,若大于则赋新值
           {
               iTemp=a[j];
               iPos=j;
           }
       }
           a[iPos]=a[i];//调换元素位置
           a[i]=iTemp;
   }
   for(int i=0;i<10;i++)//循环输出
   {
       printf("%d\n",a[i]);
   }
   return 0;
}

        解读:首先先将数组第一个单元的值和位置赋给iTemp和iPos,这样接下来才可以拿之后的数与之比较;然后开始第二层循环,发现比第一位数据大的数据之后就将它赋给iTemp和iPos,这样第二层循环的第一次循环就找到了整组数据中最大的数,并将它放在了第一位,原来第一位的数值与这个最大数调换了位置,这样最大的数就放在了第一位(如果恰好第一位的元素数值就是整组数据中最大的,很显然,依照这个算法,还是会遍历比较,但是不会挪动它的位置)。之后,第一层循环的第二次循环的目的就是找到这组数据中第二大的数,并把它放在第二位(此时第一位已经找到放好,不受影响)。以此类推,完成所有循环就排好了数组的顺序。

2.冒泡排序法:

        先看代码:(此例子是从小到大排列)

#include <stdio.h>
int main () {
    int a[10];
    for(int i=0;i<10;i++)
    {
        printf("a[%d]=",i);
        scanf("%d",&a[i]);//输入数据
    }
    int iTemp;//设置暂时存放数据的变量
    for(int i;i<10;i++)//第一层循环
    {
        for(int j=9;j>=i;j--)//第二层循环
        {
            if(a[j]<a[j-1])
            {
                iTemp=a[j-1];
                a[j-1]=a[j];
                a[j]=iTemp;
            }
        }
    }
    for(int i=0;i<10;i++)//循环输出结果
    {
        printf("%d\n",a[i]);
    }
    return 0;
}

        解读:和第一种方法一样,还是首先输入数据;之后开始两层循环,第一层循环的第一次循环相当于是第一个“泡泡”,第二层循环的作用是:从最后一位开始如果发现后边一位置的元素数值比前一位的元素数值小,就交换位置,效果是:第一层循环的第一次循环内第二层循环进行了九次循环,把整组数据中最大的数不断挪动位置到了第一位,就像“冒泡”一样,这也是为何此方法叫做冒泡排序法。之后,第2、3、4....大的数字不断“冒出”,就排好了顺序。

        OK,今天的分享就到这里,接下来会分享更多C语言数据排序的方法,并且介绍有关它们时间复杂度和空间复杂度的相关问题,如有兴趣请持续关注。

  • 2
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值