图文讲解选择排序算法的原理及在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 调用HBase的简单实例
Dec 18 Python
python 移动图片到另外一个文件夹的实例
Jan 10 Python
Python中的random.uniform()函数教程与实例解析
Mar 02 Python
PyQt5组件读取参数的实例
Jun 25 Python
pandas对dataFrame中某一个列的数据进行处理的方法
Jul 08 Python
python批量图片处理简单示例
Aug 06 Python
用什么库写 Python 命令行程序(示例代码详解)
Feb 20 Python
python实现门限回归方式
Feb 29 Python
Iconfont(矢量图标)+iconmoon(图标svg互转)配合javascript实现社交分享系统
Apr 21 Python
Python-openpyxl表格读取写入的案例详解
Nov 02 Python
python numpy中multiply与*及matul 的区别说明
May 26 Python
Python GUI编程之tkinter 关于 ttkbootstrap 的使用详解
Mar 03 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
《星际争霸2》终章已出 RTS时代宣告终结
2017/02/07 星际争霸
用PHP控制用户的浏览器--ob*函数的使用说明
2007/03/16 PHP
PHP 判断变量类型实现代码
2009/10/23 PHP
分享一个超好用的php header下载函数
2014/01/31 PHP
JavaScript入门教程(5) js Screen屏幕对象
2009/01/31 Javascript
使用javascript实现监控视频播放并打印日志
2015/01/05 Javascript
javascript中的正则表达式使用指南
2015/03/01 Javascript
jQuery的load()方法及其回调函数用法实例
2015/03/25 Javascript
Javascript函数的参数
2015/07/16 Javascript
JS实现点击事件统计的简单实例
2016/07/10 Javascript
利用JavaScript阻止表单提交的两种方法
2016/08/11 Javascript
微信小程序  Mustache语法详细介绍
2016/10/27 Javascript
微信小程序进行微信支付的步骤昂述
2016/12/01 Javascript
Angular.js中ng-if、ng-show和ng-hide的区别介绍
2017/01/20 Javascript
深入理解Angular中的依赖注入
2017/06/26 Javascript
深入掌握 react的 setState的工作机制
2017/09/27 Javascript
js获取文件里面的所有文件名(实例)
2017/10/17 Javascript
vue组件name的作用小结
2018/05/23 Javascript
Vue路由history模式解决404问题的几种方法
2018/09/29 Javascript
AngularJs中$cookies简单用法分析
2019/05/30 Javascript
使用 js 简单的实现 bind、call 、aplly代码实例
2019/09/07 Javascript
5分钟教你用nodeJS手写一个mock数据服务器的方法
2019/09/10 NodeJs
Python通过正则表达式选取callback的方法
2015/07/18 Python
Python获取本机所有网卡ip,掩码和广播地址实例代码
2018/01/22 Python
基于Pandas读取csv文件Error的总结
2018/06/15 Python
Python实现合并两个有序链表的方法示例
2019/01/31 Python
Python异常处理知识点总结
2019/02/18 Python
解决pycharm下pyuic工具使用的问题
2020/04/08 Python
Python Scrapy图片爬取原理及代码实例
2020/06/12 Python
new修饰符是起什么作用
2015/06/28 面试题
《草原的早晨》教学反思
2014/04/08 职场文书
温馨提示标语
2014/06/26 职场文书
个人反四风对照检查材料思想汇报
2014/09/23 职场文书
Python图像处理之图像拼接
2021/04/28 Python
总结Python连接CS2000的详细步骤
2021/06/23 Python
MySql子查询IN的执行和优化的实现
2021/08/02 MySQL