图文讲解选择排序算法的原理及在Python中的实现


Posted in Python onMay 04, 2016

基本思想:从未排序的序列中找到一个最小的元素,放到第一位,再从剩余未排序的序列中找到最小的元素,放到第二位,依此类推,直到所有元素都已排序完毕。假设序列元素总共n+1个,则我们需要找n轮,就可以使该序列排好序。在每轮中,我们可以这样做:用未排序序列的第一个元素和后续的元素依次相比较,如果后续元素小,则后续元素和第一个元素交换位置放到,这样一轮后,排在第一位的一定是最小的。这样进行n轮,就可排序。

原理图
图1:

图文讲解选择排序算法的原理及在Python中的实现

图2:

图文讲解选择排序算法的原理及在Python中的实现

初始数据不敏感,不管初始的数据有没有排好序,都需要经历N2/2次比较,这对于一些原本排好序,或者近似排好序的序列来说并不具有优势。在最好的情况下,即所有的排好序,需要0次交换,最差的情况,倒序,需要N-1次交换。

数据交换的次数较少,如果某个元素位于正确的最终位置上,则它不会被移动。在最差情况下也只需要进行N-1次数据交换,在所有的完全依靠交换去移动元素的排序方法中,选择排序属于比较好的一种。

python代码实现:

def sort_choice(numbers, max_to_min=True):
 """
 我这没有按照标准的选择排序,假设列表长度为n,思路如下:
  1、获取最大值x,将x移动到列最后。[n1, n2, n3, ... nn]
  2、将x追加到排序结果[n1, n3, ... nn, n2]
  3、获取排序后n-1个元素[n1, n3, ... nn],重复第一步,重复n-1次。

 max_to_min是指从大到小排序,默认为true;否则从小到大排序。
 对[8, 4, 1, 0, 9]排序,大致流程如下:
 sorted_numbers = []
 [8, 4, 1, 0, 9], sorted_numbers = [9]
 [4, 1, 0, 8], sorted_numbers = [9, 8]
 [1, 0, 4], sorted_numbers = [9, 8, 4]
 [0, 1], sorted_numbers = [9, 8, 4, 1]
 [0], sorted_numbers = [9, 8, 4, 1, 0]
 """
 if len(numbers) <= 1:
  return numbers
 sorted_list = []
 index = 0
 for i in xrange(len(numbers) - index):
  left_numbers = _get_left_numbers(numbers, max_to_min)
  numbers = left_numbers[:-1]
  sorted_list.append(left_numbers[-1])
  index += 1
 return sorted_list

def _get_left_numbers(numbers, get_max=True):
 '''
 获取最大值或者最小值x,并且将x抽取出来,置于列表最后.
 Ex: get_max=True, [1, 4, 3] ⇒ [1, 3, 4] 
  get_max=False, [1, 4, 3] ⇒ [4, 3 ,1] 
 '''
 max_index = 0
 for i, num in enumerate(numbers):
  if get_max:
   if num > numbers[max_index]:
    max_index = i
  else:
   if num < numbers[max_index]:
    max_index = i
 numbers = numbers[:max_index] + numbers[max_index + 1:] + [numbers[max_index]]
 return numbers

测试一下:

>>> get_left_numbers([0, 4, 0, 31, 9, 19, 89,67], get_max=True)
[0, 4, 0, 31, 9, 19, 67, 89]
>>> get_left_numbers([0, 4, 0, 31, 9, 19, 89,67], get_max=False)
[4, 0, 31, 9, 19, 89, 67, 0]

>>> sort_choice([0, 4, 0, 31, 9, 19, 89,67], max_to_min=False)
[0, 0, 4, 9, 19, 31, 67, 89]
>>> sort_choice([0, 4, 0, 31, 9, 19, 89,67], max_to_min=True)
[89, 67, 31, 19, 9, 4, 0, 0]
Python 相关文章推荐
使用python搭建Django应用程序步骤及版本冲突问题解决
Nov 19 Python
用Python的SimPy库简化复杂的编程模型的介绍
Apr 13 Python
详解使用python的logging模块在stdout输出的两种方法
May 17 Python
Python二叉树的定义及常用遍历算法分析
Nov 24 Python
利用pyinstaller将py文件打包为exe的方法
May 14 Python
python 读取txt,json和hdf5文件的实例
Jun 05 Python
python 从文件夹抽取图片另存的方法
Dec 04 Python
Python实现繁?转为简体的方法示例
Dec 18 Python
Python for i in range ()用法详解
Sep 18 Python
Pytorch实现基于CharRNN的文本分类与生成示例
Jan 08 Python
Python 生成VOC格式的标签实例
Mar 10 Python
Python识别验证码的实现示例
Sep 30 Python
浅谈插入排序算法在Python程序中的实现及简单改进
May 04 #Python
Python中使用插入排序算法的简单分析与代码示例
May 04 #Python
Python中函数参数设置及使用的学习笔记
May 03 #Python
解析Mac OS下部署Pyhton的Django框架项目的过程
May 03 #Python
Python使用urllib2模块抓取HTML页面资源的实例分享
May 03 #Python
Python中字符串的格式化方法小结
May 03 #Python
Python实现约瑟夫环问题的方法
May 03 #Python
You might like
php将mysql数据库整库导出生成sql文件的具体实现
2014/01/08 PHP
Smarty foreach控制循环次数的一些方法
2015/07/01 PHP
PHP 根据key 给二维数组分组
2016/12/09 PHP
js数组中如何随机取出一个值
2014/06/13 Javascript
javascript弹出页面回传值的方法
2015/01/28 Javascript
javascript结合fileReader 实现上传图片
2015/01/30 Javascript
javascript中hasOwnProperty() 方法使用指南
2015/03/09 Javascript
JS去除空格和换行的正则表达式(推荐)
2016/06/14 Javascript
easyUI实现(alert)提示框自动关闭的实例代码
2016/11/07 Javascript
JS批量替换内容中关键词为超链接
2017/02/20 Javascript
Vue 去除路径中的#号
2018/04/19 Javascript
详解关于Vue版本不匹配问题(Vue packages version mismatch)
2018/09/17 Javascript
微信小程序动画(Animation)的实现及执行步骤
2018/10/28 Javascript
vue+ts下对axios的封装实现
2020/02/18 Javascript
JS+canvas五子棋人机对战实现步骤详解
2020/06/04 Javascript
解决iView Table组件宽度只变大不变小的问题
2020/11/13 Javascript
python函数返回多个值的示例方法
2013/12/04 Python
Python Web服务器Tornado使用小结
2014/05/06 Python
浅谈Pandas Series 和 Numpy array中的相同点
2019/06/28 Python
python检测服务器端口代码实例
2019/08/31 Python
python处理excel绘制雷达图
2019/10/18 Python
window7下的python2.7版本和python3.5版本的opencv-python安装过程
2019/10/24 Python
Python实现随机取一个矩阵数组的某几行
2019/11/26 Python
Django之富文本(获取内容,设置内容方式)
2020/05/21 Python
CSS3实现类似翻书效果的过渡动画的示例代码
2019/09/06 HTML / CSS
Booking.com西班牙:全球酒店预订
2018/03/30 全球购物
数字漫画:comiXology
2020/06/13 全球购物
盛大二次面试题
2016/11/18 面试题
大学生自我评价怎样写好
2013/10/23 职场文书
质检的岗位职责
2013/11/17 职场文书
幼儿园教研活动方案
2014/01/19 职场文书
优秀毕业自我鉴定
2014/02/15 职场文书
大学生国家助学金感谢信
2015/01/23 职场文书
品质保证书格式
2015/02/28 职场文书
浅谈Java实现分布式事务的三种方案
2021/06/11 Java/Android
python游戏开发Pygame框架
2022/04/22 Python