图文讲解选择排序算法的原理及在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的几条建议分享
Feb 10 Python
python BeautifulSoup使用方法详解
Nov 21 Python
在Docker上开始部署Python应用的教程
Apr 17 Python
Python批处理删除和重命名文件夹的实例
Jul 11 Python
详解Python3序列赋值、序列解包
May 14 Python
Python中利用LSTM模型进行时间序列预测分析的实现
Jul 26 Python
Python中的单下划线和双下划线使用场景详解
Sep 09 Python
python爬虫中多线程的使用详解
Sep 23 Python
Django REST framework 单元测试实例解析
Nov 07 Python
tensorflow模型保存、加载之变量重命名实例
Jan 21 Python
Python基于xlutils修改表格内容过程解析
Jul 28 Python
浅析Python requests 模块
Oct 09 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/02/23 PHP
分享最受欢迎的5款PHP框架
2014/11/27 PHP
PHP的RSA加密解密方法以及开发接口使用
2018/02/11 PHP
Laravel 中使用简单的方法跟踪用户是否在线(推荐)
2019/10/30 PHP
TNC vs BOOM BO3 第一场2.13
2021/03/10 DOTA
javascript学习笔记(七)利用javascript来创建和存储cookie
2011/04/08 Javascript
js实现动态添加、删除行、onkeyup表格求和示例
2013/08/18 Javascript
分享JavaScript与Java中MD5使用两个例子
2015/12/23 Javascript
AngularJS中实现显示或隐藏动画效果的方式总结
2015/12/31 Javascript
详解JavaScript中Hash Map映射结构的实现
2016/05/21 Javascript
js验证真实姓名与身份证号,手机号的简单实例
2016/07/18 Javascript
jQuery使用getJSON方法获取json数据完整示例
2016/09/13 Javascript
canvas实现简易的圆环进度条效果
2017/02/28 Javascript
vue项目动态设置页面title及是否缓存页面的问题
2018/11/08 Javascript
浅析JavaScript异步代码优化
2019/03/18 Javascript
JavaScript onclick事件使用方法详解
2020/05/15 Javascript
vue实现页面切换滑动效果
2020/06/29 Javascript
如何手写简易的 Vue Router
2020/10/10 Javascript
Python获取当前路径实现代码
2017/05/08 Python
Python 16进制与中文相互转换的实现方法
2018/07/09 Python
使用python验证代理ip是否可用的实现方法
2018/07/25 Python
python 将list转成字符串,中间用符号分隔的方法
2018/10/23 Python
python 实现视频流下载保存MP4的方法
2019/01/09 Python
Python3.5基础之变量、数据结构、条件和循环语句、break与continue语句实例详解
2019/04/26 Python
PyQt5笔记之弹出窗口大全
2019/06/20 Python
将Pytorch模型从CPU转换成GPU的实现方法
2019/08/19 Python
Python for i in range ()用法详解
2020/09/18 Python
python matplotlib工具栏源码探析二之添加、删除内置工具项的案例
2021/02/25 Python
ebookers英国:隶属全球最大的在线旅游公司Expedia
2017/12/28 全球购物
蔻驰英国官网:COACH英国
2020/07/19 全球购物
食品安全检查制度
2014/02/03 职场文书
护士毕业生自荐信
2014/02/07 职场文书
春节联欢会主持词
2014/03/24 职场文书
骨干教师考核方案
2014/05/09 职场文书
村党支部群众路线教育实践活动对照检查材料
2014/09/26 职场文书
2014年仓管员工作总结
2014/11/18 职场文书