码迷,mamicode.com
首页 > 编程语言 > 详细

选择排序

时间:2020-01-12 13:35:39      阅读:74      评论:0      收藏:0      [点我收藏+]

标签:空间   优化   复杂   改变   交换   有序   最小   情况   冒泡排序   

选择排序

选择排序算法是对冒泡排序算法进行优化后得到的一种排序算法,相比冒泡排序,选择排序减少了对序列进行排序的过程中,序列元素移动的次数。

原理

以对序列进行升序排序为例:

1) 从待排序序列中选择一个待排序区间,假设待排序序列长度为n,则待排序区间由[0,n-1]、[0,n-2]、[0,n-3]逐渐减小到[0,1]。

2) 遍历待排序区间,找出待排序区间中的最大元素,遍历结束后将最大元素交换到待排序区间尾部。

3) 当所有待排序区间遍历结束,待排序序列有序。

示例

使用选择排序算法对序列89 45 68 90 29 34 17 34 进行排序,排序过程如下:

技术图片

分析

1) 选择排序是一种不稳定排序。

      观察上面示例中的“第3次遍历“,能够发现,序列中两个34的相对位置在排序前后发生了改变: 17 45 68 34 29 34 89 90 → 17 45 34 34 29 68 89 90

2) 相比较冒泡排序,选择排序显著减少了元素移动的次数。

      最坏情况下,对一个长度为n的倒序序列进行排序,使用冒泡排序需要移动元素的次数为n(n-1)/2,使用选择排序需要移动元素的次数为n-1。

3) 时间复杂度为O(n2),空间复杂度为O(1)。

优化

使用以下方式对上文的选择排序算法进行优化:

1) 从待排序序列中选择一个待排序区间,假设待排序序列长度为n,则待排序区间为:[0,n-1]、[1,n-2]、[2,n-3]……

2) 遍历待排序区间,找出待排序区间中的最大元素和最小元素,遍历结束后将最大元素和最小元素分别交换到当前待排序区间的尾部和头部。

3) 当所有待排序区间遍历结束,待排序序列有序。

 

需要注意:若待排序区间内的最大元素恰好在区间头部,最小元素恰好在区间尾部,则只能进行一次交换。

 

示例:使用优化后的选择排序算法对序列89 45 68 90 29 34 17 34 进行排序。

技术图片

优化后的选择排序算法先比优化前,排序过程中遍历序列的次数减少了一半。 

选择排序

标签:空间   优化   复杂   改变   交换   有序   最小   情况   冒泡排序   

原文地址:https://www.cnblogs.com/KenBaiCaiDeMiao/p/12182274.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!