当前课程知识点:C语言程序设计(上) >  数组(一) >  5.2 一维数组的定义和引用 >  5.2.3 一维数组的应用1--成绩排序(选择法)~2

返回《C语言程序设计(上)》慕课在线视频课程列表

5.2.3 一维数组的应用1--成绩排序(选择法)~2在线视频

5.2.3 一维数组的应用1--成绩排序(选择法)~2

下一节:5.2.4 一维数组的应用2--Fibonacci数列

返回《C语言程序设计(上)》慕课在线视频列表

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一定有一个初取值

那这一块呢

如果a[s]

这时候一定不能忘了做一件事情

记录下来 谁 j的下标

把j的下标记录下来

我只要记录它的下标我就会用新的数

跟下一个数去比较

这个循环如此简单

然后下边做什么呢

下边在循环结束了以后

那我已经确定了最大的那个数

在所有这一群数里边的下标

那我出来的数要判断一下

你原来假定的

要找的第i号位置上的这个数

s里边赋的那个初值是i

它变化了吗

s里边的

不等于你当前的外循环的这个i了吗

就是位置发生变化了吗

如果发生变化了 实施交换

最大的数 和当前位置上的数进行交换

我们就找到了 就是用这件事情

这个循环体里边

找到了我们当前要的这个大数

那我们把这个运行一下看看

大家看 这程序

我们给它初始化了一组数

省的我们从键盘上输入了

下边 就是我们刚才说的

总是a[s]跟它去比较

我们用的是后一种算法

然后

如果中间实施过了这种赋值

就说有过新的大数出现的话

s一定被改变过

被改变过 我们就要被

最后所出了这个循环做一次交换

刚才我们初始的是一个无序的数

现在看它是

是一个有序的数

而原来的数据 是这样的一个数

要不要我们把原来的数据

进行一下输出看一下呢

就说 这是一个初始值

你在进入这个之前

你要不要想把它输出来看一下呢

我们也可以用这个循环把它做一下

排序出之前它是一个什么样子呢

我们排序之前的数在这

排好序的数在哪呢

有点乱 对不对

那我们看是在这块

为什么会乱了呢

这个循环结束以后 我们在用一句话

这个应该是跳出了这个循环做一件事情

\ n

后边的什么都不要了 就让它换行一次

看这是初始化了这组数 然后把这组数输出

输出完了以后 换行

准备我们排好序的数 在看

这是一组无序的数

这是我们排好序的数

这是选择法排序

其实 排序有很多种方法 比如说

冒泡的方法

还有大家会看到许许多多的种

那个排序的算法

大家可以下去从

一些相关的资料上

或者是我们后边 也在会给大家一些

其它方法的排序的算法

大家可以做一些练习

C语言程序设计(上)课程列表:

从问题到C语言程序设计

-1.1 计算机的问题求解方法

--1.1.1--程序设计面向的问题

--1.1.2--关于计算

--1.1.3-1关于算法-算法的特征

--1.1.3-2关于算法——算法的表示

--1.1.3-3关于算法——算法的优化

--1.1.4-1-程序设计方法

--1.1.4-2-程序设计方法

--讨论题:数学模型

-1.1 计算机的问题求解方法--作业

-1.2 C语言与C程序

--1.2.1-1-C概述

--1.2.1-2-C概述

--1.2.2-C初步

--讨论题:运算符

-1.3 C语言处理系统与程序调试运行

--1.3.1C程序如何调试运行

--1.3.2常用C语言处理系统

--1.3.3DEVC++的使用-v1

--1.3.4C语言概貌小程序

--例程

-1.4 程序中的人机交互

--1.4 printf用法

--1.4.2 scanf的用法

--例程

--作业讨论区

数据计算实现与顺序结构程序设计(一)

-2.1 算术运算的C程序实现

--2.1.1 第二章

--2.1.2 C语言算术表达式概念

--2.1.3 算术运算的实现

--2.1.4 整数相除

--2.1.5 输入格式造成的计算错误

--2.1.6 求余运算

--2.1.7 自增自减运算

--2.1.8 复合运算

--fangcheng.c

--fangcheng-1.c

--fangcheng-2.c

--fangcheng-3.c

--fangcheng-4.c

--算术混合运算.c

--讨论题:自增自减符

--讨论题:程序输出结果

--讨论题:程序运行结果

-2.1 算术运算的C程序实现--作业

-2.2 关系运算的C程序实现

--2.2.1 关系比较问题

--2.2.2 C语言关系表达式

--2.2.3关系运算优先级

--2.2.4 用关系运算做判断条件

--2.2.5 程序实例

--2.2.6 字符比较

--bukao.c

--pingshifen-1.c

--panduanzhengshu.c

--pingshifen-2.c

--字符比较.c

--讨论题:比较大小

--讨论题:程序的运行

-2.2 关系运算的C程序实现--作业

-第二周作业--作业

数据计算实现与顺序结构程序设计(二)

-2.3 逻辑运算的C程序实现

--2.3.1 逻辑运算问题~1

--2.3.2 逻辑运算表达式

--2.3.3 如何判断闰年

--2.3.4 逻辑运算优先级

--2.3.5 条件运算符

--计算结合性

--2.3.7 一个简单实例

--闰年.c

--自动购票问题.c

--讨论题:逻辑表达式

-2.3 逻辑运算的C程序实现--作业

-2.4 位运算的C程序实现

--2.4.1 什么是位运算

--2.4.2 位运算有哪些

--2.4.3 位运算怎么用

--讨论题:位运算

-2.5 几种很个别的运算

--2.5 几个很个别的运算

--讨论题

--讨论题

-2.5 几种很个别的运算--作业

-2.6 混合运算及数据类型转换

--2.6 混合运算及数据类型转换

--讨论题:数据类型

-2.7 顺序结构程序实例

--2.7.1 第一个程序:三角形

--Video

--三角形面积.c

--讨论题:工业产值

--讨论题:程序无效结果

-2.7 顺序结构程序实例--作业

选择结构的程序设计

-3.1 程序中的路径选择实现

--3.1.1_1 第三章

--3.1.1_2 神奇的if_else

--打印学生成绩.c

--一元二次方程.c

-3.1 程序中的路径选择实现--作业

-3.2 路径中的再选择——嵌套判断

--3.2.1_1 if语句的嵌套

--3.2.1_2三个数排序1029

--例程

--3.2.2 用户登录检查

--三个数排序_未优化.c

--三个数排序_优化.c

--讨论题:程序改错

-3.2 路径中的再选择——嵌套判断--作业

-3.3 复杂判断问题的C程序设计

--3.3 多级选择

--银行存款.c

--讨论题:多级选择

-3.4 多分支问题的C程序设计

--3.4.1 switch语句表达式

--3.4.2 加减乘除计算

--3.4.3 几类说明

--加减乘除运算.c

--讨论题:关于switch

-3.4 多分支问题的C程序设计--作业

-3.5 GOTO的适当使用

--3.5 GOTO的适当使用

-3.6 选择结构的程序实例

--3.6 程序展示

--计算第几天.c

--存款利息__switch实现.c

--讨论题:输出奇数

--讨论题:计算税金

-3.6 选择结构的程序实例--作业

-第四周作业--作业

循环结构的程序设计(一)

-4.1 需要重复执行的程序

--4.1.1----第四章~1

--4.1.2---while实现先判断后循环~1

--4.1.3----while循环的应用-录入速度~1

--求和.c

--打印学生成绩.c

--统计录入速度.c

--求平均数.c

-4.1 需要重复执行的程序--作业

-4.2 至少要执行一次的循环

--4.2.1至少要执行一次的循环

--4.2.2-do-while循环应用

--成绩录入_do while实现.c

--n的阶乘.c

--字符分类统计.c

--讨论题:关于while

-4.2 至少要执行一次的循环--作业

-4.3 已知循环次数用for语句

--4.3.1--用for语句控制循环次数

--4.3.2--循环的应用-求和

--求和问题.c

--斐波那契数列问题.c

--数列求和.c

--讨论题:循环语句的不同

--讨论题:循环语句

-4.3 已知循环次数用for语句--作业

-4.4 循环控制——简单循环应用

--4.4.1-循环的应用-找数-水仙花数

--4.4.2--循环的应用-求素数

--水仙花数.c

--讨论题:死循环

--讨论题:continue和break

--讨论题:猜数字

-循环结构的程序设计(一)--4.4 循环控制——简单循环应用

循环结构的程序设计(二)

-4.5 循环的嵌套

--4.5.1 循环的嵌套——九九乘法表

--4.5.2 循环的嵌套——打印三角形

--打印九九乘法表.c

--打印实心三角图案.c

--打印空心三角图案.c

--讨论题:程序运行

-4.5 循环的嵌套--作业

-4.6 break与continue

--4.6 循环中断与继续循环——break再讨论

--最大素数.c

--求正数个数及平均数.c

-4.6 break与continue--作业

-4.7 循环的综合应用

--4.7.1 数的排列组合问题

--4.7.2 循环综合应用——穷举算法

--4.7.3 循环综合应用——满足条件的数

--4.7.4 循环综合应用——求最后三位数

--4.7.5 循环综合应用——打印空心图案

--数的排列组合.c

--数的排列组合优化.c

--鸡兔同笼.c

--找满足条件的数.c

--输出14的13次方的最后三位数.c

--打印空心字符.c

--讨论题:打印图形

--讨论题:打印空心图形

--讨论题:计算闰年

-第六周作业

--虚拟实验:循环程序设计实验

-第六周作业--作业

数组(一)

-5.1 同类有序数据处理问题

--5.1.0 数组开篇

--5.1.1 同类有序数据存储问题

--讨论题:下标变量与下标

-5.2 一维数组的定义和引用

--5.2.1_1 数组的定义~1

--5.2.1_2 数组的初始化

--5.2.2 一维数组的输入输出

--5.2.3 一维数组的应用1--成绩排序(选择法)~2

--5.2.4 一维数组的应用2--Fibonacci数列

--数组定义.c

--数组初始化.c

--输出大于平均值的数.c

--反向输出.c

--选择法_成绩排序.c

--求斐波那契数列前n项.c

--讨论题:对称数

--讨论题:关于'\0'

-5.2 一维数组的定义和引用--作业

-5.3 一维字符串数组

--5.3 一维字符串数组11.24~1

--用函数测试字符串长度.c

--讨论题:编程

-5.4 字符串处理函数

--5.4 字符数组的输入与输出

--字符串反向.c

--字符串函数

--讨论题:程序如何运行

--讨论题:黑色星期五

数组(二)

-5.5 二维数组的定义与使用

--5.5 二维数组定义

--二维数组的定义与初始化.c

-5.6 二维数组的输入输出

--5.6 二维数组的输入与输出

--二位数组输出_矩阵输出.c

--讨论题:随机数据存储

-5.6 二维数组的输入输出--作业

-5.7 二维数组的应用‍

--5.7.1二维数组的应用-转置矩阵

--5.7.2 用一维数组方式引用二维数组元素

--转置矩阵.c

--找二维数组最大数.c

--讨论题:修改程序

--讨论题:关于随机数函数 rand()

-5.8 二维字符数组

--5.8 单词排序

--单词排序.c

--讨论题:回文字符串

-5.8 二维字符数组--作业

-5.9 数组综合应用

--5.9.1 应用1——学生成绩统计

--统计成绩.c

--5.9.2 应用2——删除重复字符

--删除串中的重复字符串

--5.9.3 应用3——统计字符

--5.9_4数组的应用4--矩阵相乘

--统计字符次数.c

--讨论题:洗牌

-本期课程结束语

--end

-第八周编程作业

--虚拟实验:冒泡排序算法程序设计实验

期末复习

-《C语言程序设计(上)》期末复习参考

--html

期末复习答案

-《C语言程序设计(上)》期末复习参考答案

--html

5.2.3 一维数组的应用1--成绩排序(选择法)~2笔记与讨论

也许你还感兴趣的课程:

© 柠檬大学-慕课导航 课程版权归原始院校所有,
本网站仅通过互联网进行慕课课程索引,不提供在线课程学习和视频,请同学们点击报名到课程提供网站进行学习。