• 啊哈,算法自学记——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	",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:
    ");
        scanf("%d",&n);//要排序的个数
        //先清空数组
        for(i=0;i<1000;i++)
            book[i]=0;
        printf("Input data:
    ");
        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	",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:
    ");
        scanf("%d",&n);
    
        printf("Input data:
    ");
        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	",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:
    ");
        scanf("%d",&n);
    
        printf("Input the data:
    ");
        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:
    ");
        for(i=0;i<n;i++)
        {
            printf("%s--%d
    ",stu[i].name,stu[i].score);
        }
        return 0;
    }
    
    
  • 相关阅读:
    Android屏幕尺寸单位转换
    详细解读KMP模式匹配算法
    自定义View实现钟摆效果进度条PendulumView
    解决使用属性动画没有效果,监听发现属性值未发生改变问题
    数组----二维数组中的查找
    JS(二)
    JS(一)
    CSS(二)
    css(一)
    链表----删除链表中重复的节点
  • 原文地址:https://www.cnblogs.com/hhsxy/p/14018434.html
Copyright © 2020-2023  润新知