啊哈,算法自学记——1st

小哼的班上只有 5 个同学,这 5 个同学分别考了 5 分、 3 分、5 分、 2 分和 8 分,哎考得真是惨不忍睹(满分是 10 分)。接下来将分数进行从大到小排序,
排序后是 8 5 5 3 2。

#include <stdio.h>
/*满分十分,就建立一个11个数据的数组,几分出现几次就在对应的数组下标加一
*最后,几分出现几次就按照排序方式打印几次
*/
int main(int argc, char const *argv[])
{
    int socer[11];
    int i,s,j,k;
    for(j=0;j<10;j++)//数组清零
        socer[j]=0;
    for(i=0;i<5;i++)//依次输入五个数据
    {
        scanf("%d",&s);
        socer[s]++;
    }
    for(j=0;j<=10;j++)//遍历数组,从小到大打印
    {
        for(k=0;k<socer[j];k++)//对应分数出现的次数
            printf("%d\t",j);
    }
    return 0;
}

指定输入数据个数:

#include <stdio.h>

int main(int argc, char const *argv[])
{
    int book[1001];
    int x,y,i,j,k,n;
    printf("Input the number of data:\r\n");
    scanf("%d",&n);//要排序的个数
    //先清空数组
    for(i=0;i<1000;i++)
        book[i]=0;
    printf("Input data:\r\n");
    for(x=0;x<n;x++)//循环要排序的个数的次数
    {
        scanf("%d",&y);//获取数据
        book[y]++;//对应下标+1
    }
    //开始按照排序方式打印
    for(j=0;j<=1000;j++)//遍历数组打印(<=,否则1000不能打印)
    {
        for(k=0;k<book[j];k++)//book[j]是数字出现的次数,是几就打印几次
            printf("%d\t",j);//j就是对应的数字
    }
    return 0;
}

上面的方法非常浪费空间!例如需要排序数的范围是 0~2100000000 之间,那你则需要申请 2100000001 个变量,也就是说要写成 int a[2100000001]。因为我们需要用 2100000001 个“桶”来存储 0~2100000000 之间每一个数出现的次数。即便只给你 5 个数进行排序(例如这 5 个数是 1、1912345678、 2100000000、18000000 和 912345678),你也仍然需要 2100000001 个“桶”,这真是太浪费空间了!还有,如果现在需要排序的不再是整数而是一些小数,比如将
5.56789、 2.12,1.1、 3.123、 4.1234
这五个数进行从小到大排序又该怎么办呢?现在我们来学习另一种新的排序算法:冒泡排序。

冒泡排序:

排序:8 50 22 6 1 15 100 0 1000 999
原理:比较相邻的两位大小,1-2 2-3 3-4 4-5 …
如此循环n-1次可以将最大或者最小放到最后一位,再依次递减循环n-i次)i 代表已经被安排的个数

#include <stdio.h>

int main(int argc, char const *argv[])
{
    int buf[100];
    int empty;//用来互换时作为临时容器
    int m,n,i,j,k;
    printf("Input the num of data:\r\n");
    scanf("%d",&n);

    printf("Input data:\r\n");
    for(i=0;i<n;i++)//循环n次,n 个数据
    {
        scanf("%d",&buf[i]);//把输入的数据存入数组
    }
    //冒泡排序:相邻互换,每安排一位数需要互换n-1次
    for(k=0;k<(n-1);k++)//n个数排序,循环n-1次
    {
        for(j=0;j<(n-k);j++)//(n-k),k代表已经有k个数被安排好了
        {
            if(buf[j]<buf[j+1])//如果此位比后面的数小,互换
            {
                empty=buf[j+1];//把后面那位取出
                buf[j+1]=buf[j];//互换
                buf[j]=empty;//大的放前面
            }
        }
    }

    //打印
    for(i=0;i<n;i++)//打印n次
    {
        printf("%d\t",buf[i]);
    }
    return 0;
}

排序:
5个人的成绩
huhu 5
haha 3
xixi 5
hengheng 2
gaoshou 8
添加一个结构体,解决:

#include <stdio.h>

typedef struct student
{
    char name[21];
    int  score;
};

int main(int argc, char const *argv[])
{
    int i,j,n;
    struct student stu[100],t;

    printf("The num of data:\r\n");
    scanf("%d",&n);

    printf("Input the data:\r\n");
    for(i=0;i<n;i++)
    {
        scanf("%s %d",&stu[i].name,&stu[i].score);        
    }

    for(i=0;i<n-1;i++)//n个数据,循环n-1次
    {
        for(j=0;j<n-i;j++)
        {
            if(stu[j].score<stu[j+1].score)
            {
                t=stu[j+1];//t为结构体类型
                stu[j+1]=stu[j];
                stu[j]=t;
            }
        }
    }

    printf("result:\r\n");
    for(i=0;i<n;i++)
    {
        printf("%s--%d\r\n",stu[i].name,stu[i].score);
    }
    return 0;
}

发布了14 篇原创文章 · 获赞 8 · 访问量 1698

猜你喜欢

转载自blog.csdn.net/weixin_43739167/article/details/104965363
1st
今日推荐