课程首页 › 第4部分 › 第67课

第67课 经典之选择排序

第4部分 点、线、面、立体的组合 · 数组· 知识点:数组、选择排序

经典之选择排序(数组、选择排序)

选择排序是一种简单但强大的排序算法,它可以帮助我们对一组存储在数组中的数字进行排序。选择排序的工作方式很简单。它在每一轮中找到数组中未排序部分的最小元素,然后将其与未排序部分的第一个元素交换位置。不断重复这个过程,每次都将一个数组元素放到正确的位置,直到整个数组排序完成。

我们的任务是运用选择排序的方法将数组int arr[15]={23,45,12,24,67,16,8,98,54,43,46,45,109,68,86}按照从小到大的顺序排列。

核心思想

不断找到数组中未排序部分的最小元素或最大元素,然后将其与数组中未排序部分的第一个元素交换位置。

可以将要排序的数组看作两个序列:一个是已排列序列,一个是未排列序列。每次从未排列序列中通过依次比较找出最小元素或最大元素,按照顺序放入已排列序列中,当未排列序列的元素全部放入已排序序列中时,排序就完成了。

选择排序的基本操作:

(1)每轮比较找出最大或最小元素。

(2)依次将最大或最小元素排在前面。

选择排序法的推演

来吧,试试对9、5、8、6、3这组数字进行一次选择排序,看看有什么不同。

同样按照从小到大的顺序排列。

1.第一轮开始

(1)第一波,将第一个元素设为最小值min。

插图

(2)第二波比较min(9)和5。

插图

(3)第三波比较min(5)与8。

插图

(4)第四波比较min(5)与6。

插图

(5)第五波比较min(5)与3。

插图

(6)最后将最小值3所在的元素与第一个元素9互换位置。

插图

2.第二轮,比较未排序数字,取出未排序中的最小值

(1)第一波,取未排序第一个元素5设为min。

插图

(2)第二波比较min(5)与8。

插图

(3)第三波比较min(5)与6

插图

(4)第四波比较min(5)与9

插图

(5)这波比较依旧是5最小,所以不用交换位置。

插图

3.第三轮,比较未排序数字,取出未排序中的最小值

(1)第一波,取未排序第一个元素8设为min。

插图

(2)第二波比较min(8)与6。

插图

(3)第三波比较min(6)与9。

插图

(4)最后将未排序最小值6所在的元素与未排序第一个元素8互换位置。

插图

4.第四轮,比较未排序数字,取出未排序中的最小值

(1)第一波,取未排序第一个元素8设为min。

插图

(2)第二波比较min(8)与9。

插图

(3)最后依旧是8最小,所以不用换位置。

插图

(4)只剩最后一个数字了,无须继续比较,排序结束。

插图

敲黑板

关键来啦,需要几轮?需要几波?

一起来总结和思考:

(1)5个数字,每一轮需要找出一个最小值,总共花费4轮。如果有n个数字,确定了n-1个数字的正确排序,也就完成了n个数字的排序。每轮找出一个最小值,全部确定需要n-1轮。

(2)每一轮又进行了多波的比较呢?5个数字一轮比较需要4波。比较波数比剩余需要比较的数字的数量少1。但是不是从头开始,而是从n-轮数开始。例如,第二轮是从第二个元素开始的。

(3)每一轮取出较小的值,依次比较寻找更小的值,以确定本轮的最小值。

程序逻辑

来吧,根据总结和思考选择排序的基本操作,我们编写代码。

假设有n个数字进行排序,组合成数组arr[n]。

插图

(2)每轮需要比剩余需要比较的数字的数量少1波的比较。

插图

但是有一点需要注意,比较不是从数组下标0开始,而是从数组下标i开始,那到什么时候结束呢?也是到最后一个数字的数组下标为n-1时结束。

插图

(3)已进入外层循环,就需要将剩余的第一个元素设为最小值,同时为了便于后续的位置互换,需要记录最小值的位置。

插图

(4)如果遇到更小值,则将更小值替换min,并重新记录位置。

插图

(5)如果最小值不是第一位,则需要将最小值和第一位互换位置,第一位就是i所在的位置。

插图

选择排序

插图

运行程序:

巩固练习

(1)选择排序的工作原理是什么?()

A.将数组的元素按字母顺序排列

B.多次遍历数组,找到未排序部分的最小或最大元素,并将其移到已排序部分的一端

C.随机重新排列数组的元素

D.将数组的元素反转

(2)如果对一个有100个元素的数组进行选择排序,它将执行多少次比较操作?()

A.100

B.99

C.4950

D.9900

(3)假设你有一个班级的10位学生成绩(整数),想用选择排序将成绩按从高到低的顺序排序。请编写一个C++程序,对输入的10个成绩使用选择排序进行排序,并输出结果。

样例输入:

样例输出: