当前课程知识点:C语言程序设计(上) > 数组(一) > 5.2 一维数组的定义和引用 > 5.2.3 一维数组的应用1--成绩排序(选择法)~2
大家好
我们在来看一维数组的几个应用
我们还拿成绩排序这个例子说事
我们在开始讲这个数组的时候
就举了一个例子说
如果没有数组的支持的话呢
这个循环 都实现不了排序的功能
那我们现在这个例子说
如果我们对学生成绩进行排序的话
那学生成绩 学生的人数是
每个班是不一样的 所以呢
我们这个循环 就是
要这个排序的序一共有多少个呢
n个 那我这个
找大数这件事情
我们原来举得例子说
10个数我要任意排序
那我总是从找第一个大数第二个大数
一定找到多少呢
n-1那就是第9个大数
然后第10个 第10名就不用找了
那我们 如果是学生
n个学生 那我一定是说
从第1号开始找 找到n-1号
这个事情我们看起来是跟
这个排序有点像 说
我们在外循环里边就是打一行打一行这样
而我们现在这的打一行是要找什么呢
是要做什么 找一个大数再找一个大数
而我这件事情一共做多少次呢
做n-1次
那找 第i个大数这件事情
找每一个大数这件事情
详细的怎么描述呢
我们看一下 那实际上呢
这个问题是排序这个算法里边的最核心的
因为对外循环来说
我们说它跟打图形一样差不多
就是打一行打一行
我们这个 排序这件事情也是
找一个大数 在找一个大数
那如何找到这个大数
算法是很多的 我们这来看两种
在我们讲数组一开始的时候
就给过大家这么一个图
说 10个
简单的10个数字
我们要把它从大到小排出来
我们现在的排序的顺序是从大到小
那么怎么排呢
我们当时给过大家这样的一个图
说 最简单的 最直接的考虑说
当前你要找哪个 我要找
这个 第一号位置上的这个大数
那我们假定它最大
我拿它跟下一个比较
那么我比较第一个回合的时候
3和5比较的时候就发现5比3大
那这时候我可以做交换
把5交换在这个位置上
让这个位置上始终保持最大数
在比较下一个
那又发现一个大数
交换 这个位置上又是7了
下面 7和6比较
不大了 不交换
那这时候这保持的是7
那我在一直把这个事情进行到底
比较完了 进行到最后一个数
比较完了 那我这个位置上
一定保留下来的是黄颜色的10
这就是最大数被留在了这个位置上
大家看这个算法呢
是最直接最简单
但是我们看
他在这个过程里边描述是不是这样
是它的简单在于说我总是用
当前要找的i号大数
和它的下一个数进行比较
而下一个数呢
是从它的下一个依次循环到完
但是呢 它的问题是什么呢
交换这件事情 做了多少次呢
比如说在这个问题里边做了
1次 2次...5次
做了5次交换
是前4次的交换都不到位
才做了第5次
也就说 没有发现最终的大数的时候
你就已经进行了交换
显然这个效率 程序的效率是不高的
但是 这个可读性是比较好的
找第i个大数就是i
i号位置上的数和下边的依次进行
下边的每一个位置上依次进行比较
好的一个办法 有没有呢
可以啊 比如说我们这样做
3后就是找当前第i个大数
他俩比较 发现了有比它大的
前边的数据弃置 扔掉了
我就用这个位置上的数
去进行比较 这是数组的优势
什么优势 它的位置优势
我只要记录下它的位置
我不一定忙着去交换
用这个位置上的数
和它的下一个数比较
又发现一个大数
前边的弃置
用这个位置上的数
再跟下一个比较
那么下一个不大了当然他就不丢了
我继续用t和这个4比较
那么比较完了也不交换
等比较到8的时候7已经被丢了
我用8跟后边的依次比较
发现新的大数的时候记录下来
和下边比较 没有改变
最后留下的位子
一定就是10号数所在的位置
这就是这个算法的思路
什么思路 就是外循环没有变
跟它是一样的 只是内循环的方式变了
变了什么呢 最主要的是变了说
当前你拿谁和j位置上的数进行比较呢
不是一个确定位置上的数
和它们去比较
而是一个流动的数
为什么要流动呢
是不同位置上
总是当前最大的那个位置上的数
和下一个数去比较
这样省去了这个过程中的交换
我只要过程中做什么呢
记录下来当前的
大数的下标 比如说第1
第1个 我只要记录下来
这个位置上的位置号就可以了
所以 我们在这个思路里边说
一开始 我们先假定
i这个位置上就是最大的那个数
那我第一次肯定是用i去比较
而后边呢
我就不是了
后边我要记录下来
当前最大数字的
所在的位置的下标 怎么做这件事呢
一定是说
我给s里边赋了一个新的值
这个新的值一定是1
当前找到的那个j了
那这一块我们当前未知
就是s了
就说用s和它比较
就当前最大的数据
一定是从j获得
只有 说你小才会把j送到s
那s就是当前最大的数所在的下标
那这样
看来两个比较的话一定是
这种方法的运行效率要高的
所以 我们看它的程序
是不是应该这样写
我们看一下 这一块
大家不忘了s一定有一个初取值
那这一块呢
-1.1 计算机的问题求解方法
--讨论题:数学模型
-1.1 计算机的问题求解方法--作业
-1.2 C语言与C程序
--讨论题:运算符
-1.3 C语言处理系统与程序调试运行
--例程
-1.4 程序中的人机交互
--例程
--作业讨论区
-2.1 算术运算的C程序实现
--算术混合运算.c
-2.1 算术运算的C程序实现--作业
-2.2 关系运算的C程序实现
--bukao.c
--字符比较.c
--讨论题:比较大小
-2.2 关系运算的C程序实现--作业
-第二周作业--作业
-2.3 逻辑运算的C程序实现
--计算结合性
--闰年.c
--自动购票问题.c
-2.3 逻辑运算的C程序实现--作业
-2.4 位运算的C程序实现
--讨论题:位运算
-2.5 几种很个别的运算
--讨论题
--讨论题
-2.5 几种很个别的运算--作业
-2.6 混合运算及数据类型转换
--讨论题:数据类型
-2.7 顺序结构程序实例
--Video
--三角形面积.c
--讨论题:工业产值
-2.7 顺序结构程序实例--作业
-3.1 程序中的路径选择实现
--打印学生成绩.c
--一元二次方程.c
-3.1 程序中的路径选择实现--作业
-3.2 路径中的再选择——嵌套判断
--例程
--讨论题:程序改错
-3.2 路径中的再选择——嵌套判断--作业
-3.3 复杂判断问题的C程序设计
--3.3 多级选择
--银行存款.c
--讨论题:多级选择
-3.4 多分支问题的C程序设计
--加减乘除运算.c
-3.4 多分支问题的C程序设计--作业
-3.5 GOTO的适当使用
-3.6 选择结构的程序实例
--3.6 程序展示
--计算第几天.c
--讨论题:输出奇数
--讨论题:计算税金
-3.6 选择结构的程序实例--作业
-第四周作业--作业
-4.1 需要重复执行的程序
--求和.c
--打印学生成绩.c
--统计录入速度.c
--求平均数.c
-4.1 需要重复执行的程序--作业
-4.2 至少要执行一次的循环
--n的阶乘.c
--字符分类统计.c
-4.2 至少要执行一次的循环--作业
-4.3 已知循环次数用for语句
--求和问题.c
--数列求和.c
--讨论题:循环语句
-4.3 已知循环次数用for语句--作业
-4.4 循环控制——简单循环应用
--水仙花数.c
--讨论题:死循环
--讨论题:猜数字
-循环结构的程序设计(一)--4.4 循环控制——简单循环应用
-4.5 循环的嵌套
--讨论题:程序运行
-4.5 循环的嵌套--作业
-4.6 break与continue
--最大素数.c
-4.6 break与continue--作业
-4.7 循环的综合应用
--数的排列组合.c
--鸡兔同笼.c
--打印空心字符.c
--讨论题:打印图形
--讨论题:计算闰年
-第六周作业
-第六周作业--作业
-5.1 同类有序数据处理问题
-5.2 一维数组的定义和引用
--数组定义.c
--数组初始化.c
--反向输出.c
--讨论题:对称数
-5.2 一维数组的定义和引用--作业
-5.3 一维字符串数组
--讨论题:编程
-5.4 字符串处理函数
--字符串反向.c
--字符串函数
-5.5 二维数组的定义与使用
-5.6 二维数组的输入输出
-5.6 二维数组的输入输出--作业
-5.7 二维数组的应用
--转置矩阵.c
--讨论题:修改程序
-5.8 二维字符数组
--5.8 单词排序
--单词排序.c
-5.8 二维字符数组--作业
-5.9 数组综合应用
--统计成绩.c
--统计字符次数.c
--讨论题:洗牌
-本期课程结束语
--end
-第八周编程作业
-《C语言程序设计(上)》期末复习参考
--html
-《C语言程序设计(上)》期末复习参考答案
--html