和我一起从0学算法(C语言版)(一)
第一章 排序
第一节 简化版桶排法
友情提示:此文章分享给所有小白,大牛请绕路!
生活中很多地方需要使用排序,价格的由低到高、距离的由远及近等,都是排序问题的体现。如果排序量较少,依靠个人能力很容易实现;但如果排序种类多、数量大,则很难依靠脑力解决。这时就需要我们利用算法来解决问题。
如果你现在还没离开,那么我就认为你是和我一样不怎么懂算法的小白了。
你是否学习过C语言?请继续:请学习C语言后再回来;
还没有离开?!那么说明你看懂了上面表达式,问题正式开始。
问题:在一次评比过程中,五位同学分别得到了评委老师的不同评分(满分为10分):5分,2分,7分,9分,7分。请你将五个分数按从小到大排序。
思路:满分为10分,则我们可以创建0-10,共11个数组来分别存储这11种不同的分数的个数。先初始化11个数组值都为0,再遍历每个人的分数,读取到该分数后,该分数对应数组值加1。遍历完成后,按数组下标从小到大输出数组值。
程序示例:
#include<stdio.h>
#define n 5 // 宏定义常量n等于5
int main() {
int a[11],i,j,t;
for (i=0;i<=10;i++)
a[i]=0; // 初始化为0
for (i=1;i<=n;i++) { // 循环读入5个数
scanf("%d",&t); // 把每一个数读到变量t中
a[t]++;
}
for (i=0;i<=10;i++) // 循环输出数组非0值
for (j=1;j<=a[i];j++)
printf("%d",i);
return 0;
}
试想 如果排序方式为从大到小,则如何修改程序。
第二节 冒泡排序
接上一节,如果我们在从小到大排序时,要求输出该分数对应的名字,则不能利用桶排法进行排序。这时为了解决这个问题,我们需要利用新的算法来完成该操作。我希望读者可以跟着我的思路一起创造这个算法,尽管这种算法早就被人所创造,但利用创造的思路来思考问题,可以培养我们思考的能力,来创造真正没人想到过的东西。博主能力有限,不足之处请指出,谢谢!
现在,大家来思考一个问题,如果我们要对几个蚂蚁巢穴中蚂蚁的数量经行排序(先不考虑统计个数的问题),那么桶排法显然是不行的,有数以万记的蚂蚁,就要创建数以万记的数组,是对内存极大的浪费。一个好的算法是可以在最短时间里,利用最小内存等来解决问题的。
不知道大家曾经是否观察过水与植物油的分层现象,无论是先加油、还是先加水,最终在上层的一定是黄色的植物油,下层一定是透明的水。简单的物理学,告诉我们,植物油的密度小于水的密度,所以,相对较轻的植物油漂浮在水面上。
根据这个例子,我们可以想到:在从小到大排序中,比较相邻两个数的大小。如果前一个数大于后一个数,则互换这两个数的位置;否则,不做处理。这样第一次从第一个数据开始,逐个比较至最后一个数据时,最后一个数据一定为此组数据的最大值。然后第二次从第一个数据开始,逐个比较至倒数第二个数据时,此数组倒数第二个数据也一定为此组数据第二大值。第三次...
程序示例:
#include<stdio.h>
int main() {
int a[100],i,j,t,n;
scanf("%d",&n); // 输入一个数n,表示接下来将会输入n个数
for (i=1;i<=n;i++) // 循环读入n个数到数组a中
scanf("%d",&a[i]);
for (i=1;i<n;i++) //n个数排序,只需经行n-1次
for (j=1;j<=n-i;j++)
if (a[j]>a[j+1]) { // 判断并交换值
t=a[j];
a[j]=a[j+1];
a[j+1]=t;
}
for (i=1;i<=n;i++)
printf("%d ",a[i]);
return 0;
}
对此程序经行改造,就可以按评分的从小到大顺序,输出名字。如以下:
程序示例:
#include<stdio.h>
struct student {
char name[10];
int score;
}; // 创建一个结构体用来储存姓名和分数
int main() {
struct student a[100],t;
int i,j,n;
scanf("%d",&n); // 输入一个数n,表示接下来将会输入n个数
for (i=1;i<=n;i++) // 循环读入n个数到数组a中
scanf("%s %d",a[i].name,&a[i].score);
for (i=1;i<n;i++) //n个数排序,只需经行n-1次
for (j=1;j<=n-i;j++)
if (a[j].score>a[j+1].score) { // 判断并交换值
t=a[j];
a[j]=a[j+1];
a[j+1]=t;
}
for (i=1;i<=n;i++)
printf("%s ",a[i].name);
return 0;
}
注:此专题参考于《啊哈!算法》(啊哈磊 著),想要了解更多请购买正版书籍。
附:诗
你是人间的四月天 ———— 一句爱的赞颂
林徽因
我说 你是人间的四月天;
笑响点亮了四面风;
轻灵在春的光艳中交舞着变。
你是四月早天里的云烟,
黄昏吹着风的软,
星子在无意中闪,
细雨点洒在花前。
那轻,那娉婷,你是,
鲜妍百花的冠冕你戴着,
你是天真,庄严,
你是夜夜的月圆。
雪化后那片鹅黄,你像;
新鲜初放芽的绿,你是;
柔嫩喜悦,
水光浮动着你梦期待中白莲。
你是一树一树的花开,
是燕在梁间呢喃,
——你是爱,是暖,是希望,
你是人间的四月天!
声明:
上周差下的这周会补上,上周末好累,原谅我嘞。。。
以上。
和我一起从0学算法(C语言版)(一)的更多相关文章
- 和我一起从0学算法(C语言版)(四)
第三章 搜索 深度优先搜索与宽度优先搜索 定义 深度优先搜索(DFS) 过程简要来说是对每一个可能的分支路径深入到不能再深入为止,而且每个节点只能访问一次. 宽度优先搜索(BFS) 不考虑结果的可能位 ...
- 和我一起从0学算法(C语言版)(三)
第二章 暴力求解(枚举法) 第一节 小学奥数题-程序求解 观察下面的加法算式: 祥 瑞 生 辉 + 三 羊 献 瑞 ------------------- 三 羊 生 瑞 气 ...
- 和我一起从0学算法(C语言版)(二)
第一章 排序 第三节 快速排序 快速排序是最常用的排序方法.快排运用的递归方法很有意思.掌握了这种排序方法可以在将来学习递归时更快入门.只是快排的思路与之前的排序方法相比较为复杂,再加担心上我的表达能 ...
- 教孩子学编程 python语言版PDF高清完整版免费下载|百度云盘|Python入门
百度云盘:教孩子学编程 python语言版PDF高清完整版免费下载 提取码:mnma 内容简介 本书属于no starch的经典系列之一,英文版在美国受到读者欢迎.本书全彩印刷,寓教于乐,易于学习:读 ...
- libnode 0.4.0 发布,C++ 语言版的 Node.js
libnode 0.4.0 支持 Windows ,提升了性能,libuv 更新到 0.10.17 版本,libj 更新到 0.8.2 版本. libnode 是 C++ 语言版的 Node.js,和 ...
- 快速排序算法C语言版
快速排序(Quicksort)是对冒泡排序的一种改进. 快速排序由C. A. R. Hoare在1962年提出.它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比 ...
- 数据结构1:数据结构与算法C语言版分析概述
本节开始将带领大家系统地学习数据结构,作为一门计算机专业大二学生的必修课程,该课程面对的目标人群为初步具备基本编程能力和编程思想的程序员(大一接触了 C 语言或者 C++).通过系统地学习数据结构,可 ...
- 《数据结构与算法(C语言版)》严蔚敏 | 第五章 建立二叉树,并完成三/四种遍历算法
PS:所有的代码示例使用的都是这个图 2019-10-29 利用p126的算法5.3建立二叉树,并完成三种遍历算法 中序 后序 先序 #include<iostream> #include ...
- 【排序】表插入排序算法(C语言版)
排序耗时的操作主要分为两种:查找比较.记录移位. 1.表插入排序 在查找比较基础上,尽量减少记录移位步数,可以令排序操作耗时降低,表插入排序正是为减少移位次数而出现的. 在数据结构上,数据是存储在静态 ...
随机推荐
- springboot - 在servlet中映射Errors 脱离spring mvc
应用不用Spring MVC, 采用ErrorPageRegistrar 接口能直接映射errors. 1.概览 2.java代码 1).MyAppServlet package com.ebc.se ...
- Mysql自动备份与还原 转
Mysql自动备份与还原 一.自动备份:将以下代码保存为*.bat批处理脚本,然后再添加Windows定时作业,如每天凌晨2点执行:set s=%date:~0,4%%date:~5,2%%date: ...
- SQL decode 函数的用法
decode 函数基本语法: decode(字段|表达式,条件1,结果1,条件2,结果2,...,条件n,结果n,缺省值): --缺省值可以省略 表示如果 字段|表达式 等于 条件1 时,DECODE ...
- 七十六、SAP中数据库的查询用法之 COUNT(总数),SUM(求和),AVG(求平均),GROUP BY(分组)
一.我们来查看一个sbook的数据库 二.查看这个表的内容如下 三.表数据如下 四.代码如下 五.结果如下 *&---------------------------------------- ...
- 实现Comparator 对List<?>进行排序
首选需要有个Entity类 ,里面有属性有方法 package demo; public class Entity { private String empNo ; private String em ...
- 吴裕雄--天生自然JAVA SPRING框架开发学习笔记:Spring事务管理接口PlatformTransactionManager、TransactionDefinition和TransactionStatus
Spring 的事务管理是基于 AOP 实现的,而 AOP 是以方法为单位的.Spring 的事务属性分别为传播行为.隔离级别.只读和超时属性,这些属性提供了事务应用的方法和描述策略. 在 Java ...
- 吴裕雄--天生自然C++语言学习笔记:C++ 数据封装
所有的 C++ 程序都有以下两个基本要素: 程序语句(代码):这是程序中执行动作的部分,它们被称为函数. 程序数据:数据是程序的信息,会受到程序函数的影响. 封装是面向对象编程中的把数据和操作数据的函 ...
- Elasticsearch 使用集群
章节 Elasticsearch 基本概念 Elasticsearch 安装 Elasticsearch 使用集群 Elasticsearch 健康检查 Elasticsearch 列出索引 Elas ...
- CVE-2010-0249(极光)分析报告
2019/9/10 报告doc在文件里面 1. 发现可疑流量 A.分析流量,导出字节流 B.得到网页代码,发现需要执行的代码需要解密(加密的字符串部分太长了,就省略了): C. ...
- Codeforces 392 C Unfair Poll(模拟)
题意:老师点名顺序规则如下:第1排,第2排,……,第n-1排,第n排,第n-1排,……,第2排,第1排,第2排,……,第n-1排,第n排,……对于每排都是从左到右依次点名,问点名k个人后,所有人中最多 ...