「 选择排序 」虽然在实际应用中没有「 插入排序 」广泛,但它也是我们学习排序算法中必不可少的一种。「 冒泡排序 」和「 插入排序 」都是在两层嵌套循环中慢慢比较元素,不停的调整元素的位置。而「 选择排序 」就比较直接了,属于不出手则已,一出手,相应的元素就必须要到位,元素的位置就不会再变了。
下面我们来详细了解下一下它的逻辑。
一、「 选择排序 」是什么?
选择排序 也是一种很简单的排序算法,它的思路也是将一组待排序的数据,分成2段,一段是“已排序”了的数据,另一段是“未排序”的数据。当然,在最开始的时候,“已排序”区段里是没有数据的。排序开始后,每次都从“未排序”的数据中取出一个最小的元素(注意,这里是取最小的元素,这一点与「 插入排序 」是不同的),然后将这个最小的元素插入到“已排序”数据中末尾元素的后面(这里其实是将这个最小元素与“已排序”数据的末尾紧邻的下一位元素进行交换),这样保持了“已排序”中的数据永远是有序的。一直这么循环的去处理,直到所有的“未排序”的数据都已交换完,则整个排序全部完成。
下面用图示例讲解一下:
(图片来源网络)
从上图可以看到,初始数组是
元素 | 29 | 72 | 98 | 13 | 87 | 66 | 52 | 51 | 36 |
---|---|---|---|---|---|---|---|---|---|
下标 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
要对这个数组进行从小到大排序,默认初始状态是全部无序的,因此对这个数组开始遍历找最小元素。
1.第一遍大循环时,在整个数组中找到最小元素“13”,将这个最小元素“13”与数组的开头位置元素“29”进行交换。交换后数组为:
元素 | 13 | 72 | 98 | 29 | 87 | 66 | 52 | 51 | 36 |
---|---|---|---|---|---|---|---|---|---|
下标 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
2.第二遍大循环时,元素“13”属于“已排序”区段了,剩下所有元素都属于“未排序”的区段。从剩下元素中找到最小元素“29”,将这个最小元素“29”与元素“72”进行交换(因为元素“72”是已排序数组紧邻的后一位元素),交换后数组为:
元素 | 13 | 29 | 98 | 72 | 87 | 66 | 52 | 51 | 36 |
---|---|---|---|---|---|---|---|---|---|
下标 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
3.第三遍大循环时,“已排序”区段里已经有元素“13”、“29”了,剩下其它元素都属于“未排序”的。从剩下元素中找到最小元素“36”,将这个最小元素“36”与元素“98”进行交换(因为元素“98”是已排序数组紧邻的后一位元素),交换后数组为:
元素 | 13 | 29 | 36 | 72 | 87 | 66 | 52 | 51 | 98 |
---|---|---|---|---|---|---|---|---|---|
下标 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
4.第四遍大循环时,“已排序”区段里已经有元素“13”、“29”、“36”了,剩下其它元素都属于“未排序”的。从剩下元素中找到最小元素“51”,将这个最小元素“51”与元素“72”进行交换(因为元素“72”是已排序数组紧邻的后一位元素),交换后数组为:
元素 | 13 | 29 | 36 | 51 | 87 | 66 | 52 | 72 | 98 |
---|---|---|---|---|---|---|---|---|---|
下标 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
5.第五遍大循环时,“已排序”区段里已经有元素“13”、“29”、“36”、“51”了,剩下其它元素都属于“未排序”的。从剩下元素中找到最小元素“52”,将这个最小元素“52”与元素“87”进行交换(因为元素“87”是已排序数组紧邻的后一位元素),交换后数组为:
元素 | 13 | 29 | 36 | 51 | 52 | 66 | 87 | 72 | 98 |
---|---|---|---|---|---|---|---|---|---|
下标 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
6.第六遍大循环时,“已排序”区段里已经有元素“13”、“29”、“36”、“51”、“52”了,剩下其它元素都属于“未排序”的。从剩下元素中找到最小元素“66”,发现这个最小元素“66”已经是位于已排序数组紧邻的后一位元素了,因此无需交换,数组保持不变:
元素 | 13 | 29 | 36 | 51 | 52 | 66 | 87 | 72 | 98 |
---|---|---|---|---|---|---|---|---|---|
下标 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
7.第七遍大循环时,“已排序”区段里已经有元素“13”、“29”、“36”、“51”、“52”、“66”了,剩下其它元素都属于“未排序”的。从剩下元素中找到最小元素“72”,将这个最小元素“72”与元素“87”进行交换(因为元素“87”是已排序数组紧邻的后一位元素),交换后数组为:
元素 | 13 | 29 | 36 | 51 | 52 | 66 | 72 | 87 | 98 |
---|---|---|---|---|---|---|---|---|---|
下标 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
8.第八遍大
相关推荐
0评论