图文讲解选择排序算法的原理及在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中用pycurl监控http响应时间脚本分享
Feb 02 Python
Python中tell()方法的使用详解
May 24 Python
python实现备份目录的方法
Aug 03 Python
python并发编程之线程实例解析
Dec 27 Python
Python爬虫框架scrapy实现downloader_middleware设置proxy代理功能示例
Aug 04 Python
python绘制多个曲线的折线图
Mar 23 Python
深入理解Django自定义信号(signals)
Oct 15 Python
windows下安装Python虚拟环境virtualenvwrapper-win
Jun 14 Python
python清空命令行方式
Jan 13 Python
使用python计算三角形的斜边例子
Apr 15 Python
Python常用扩展插件使用教程解析
Nov 02 Python
PyQt5 显示超清高分辨率图片的方法
Apr 11 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引用地址改变变量值的问题
2012/03/23 PHP
php程序总是提示验证码输入有误解决方案
2015/01/07 PHP
Yii框架实现多数据库配置和操作的方法
2017/05/25 PHP
利用PHPStorm如何开发Laravel应用详解
2017/08/30 PHP
详细解读php的命名空间(二)
2018/02/21 PHP
PHP的简单跳转提示的实现详解
2019/03/14 PHP
如何让PHP编码更加好看利于阅读
2019/05/12 PHP
php屏蔽错误及提示的方法
2020/05/10 PHP
jQuery 使用手册(五)
2009/09/23 Javascript
JavaScript Event学习第五章 高级事件注册模型
2010/02/07 Javascript
toString()一个会自动调用的方法
2010/02/08 Javascript
浅谈Javascript事件处理程序的几种方式
2012/06/27 Javascript
jQuery easyui datagrid动态查询数据实例讲解
2013/02/26 Javascript
JQuery设置和去除disabled属性的5种方法总结
2013/05/16 Javascript
js实现广告漂浮效果的小例子
2013/07/02 Javascript
jquery实现多级下拉菜单的实例代码
2013/10/02 Javascript
对Jquery中的ajax再封装,简化操作示例
2014/02/12 Javascript
javascript实现图片自动和可控的轮播切换特效
2015/04/13 Javascript
jquery图片预览插件实现方法详解
2019/07/18 jQuery
Python使用正则匹配实现抓图代码分享
2015/04/02 Python
Python实现计算文件夹下.h和.cpp文件的总行数
2015/04/23 Python
Python 编码规范(Google Python Style Guide)
2018/05/05 Python
matplotlib.pyplot绘图显示控制方法
2019/01/15 Python
解决python Markdown模块乱码的问题
2019/02/14 Python
Django保护敏感信息的方法示例
2019/05/09 Python
Appium+python自动化怎么查看程序所占端口号和IP
2019/06/14 Python
python plotly画柱状图代码实例
2019/12/13 Python
没编程基础可以学python吗
2020/06/17 Python
pytorch中的weight-initilzation用法
2020/06/24 Python
python中@property的作用和getter setter的解释
2020/12/22 Python
关于爱情的广播稿
2014/01/16 职场文书
一份创业计划书范文
2014/02/08 职场文书
大学学习个人的自我评价
2014/02/18 职场文书
化学专业自荐信
2014/05/28 职场文书
捐助倡议书
2015/01/19 职场文书
会议通知格式范文
2015/04/15 职场文书