图文讲解选择排序算法的原理及在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获取局域网占带宽最大3个ip的方法
Jul 09 Python
使用Python生成随机密码的示例分享
Feb 18 Python
简单谈谈Python中函数的可变参数
Sep 02 Python
详解Python list 与 NumPy.ndarry 切片之间的对比
Jul 24 Python
Windows系统下多版本pip的共存问题详解
Oct 10 Python
使用Python写一个小游戏
Apr 02 Python
Django中的文件的上传的几种方式
Jul 23 Python
PyTorch安装与基本使用详解
Aug 31 Python
Python实现加密的RAR文件解压的方法(密码已知)
Sep 11 Python
PyTorch 实现L2正则化以及Dropout的操作
May 27 Python
Python Django模型详解
Oct 05 Python
Python学习之迭代器详解
Apr 01 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不用正则采集速度探究总结
2008/03/24 PHP
php获取目标函数执行时间示例
2014/03/04 PHP
PHP 微信支付类 demo
2015/11/30 PHP
php版微信自定义回复功能示例
2016/12/05 PHP
PHP实现的支付宝支付功能示例
2019/03/26 PHP
PHP常见的序列化与反序列化操作实例分析
2019/10/28 PHP
php 使用 __call实现重载功能示例
2019/11/18 PHP
JS判断数组中是否有重复值得三种实用方法
2013/08/16 Javascript
Jquery实现图片左右自动滚动示例
2013/09/25 Javascript
javascript如何动态加载表格与动态添加表格行
2013/11/27 Javascript
seajs中模块的解析规则详解和模块使用总结
2014/03/12 Javascript
IE7浏览器窗口大小改变事件执行多次bug及IE6/IE7/IE8下resize问题
2015/08/21 Javascript
JavaScript中cookie工具函数封装的示例代码
2016/10/11 Javascript
探索Vue.js component内容实现
2016/11/03 Javascript
js前端实现多图图片上传预览的两个方法(推荐)
2016/11/18 Javascript
JavaScript瀑布流布局实现代码
2017/05/06 Javascript
vue 中使用print.js导出pdf操作
2020/11/13 Javascript
Python设计模式之观察者模式实例
2014/04/26 Python
Python中比较特别的除法运算和幂运算介绍
2015/04/05 Python
Python基于pygame模块播放MP3的方法示例
2017/09/30 Python
Python实现的凯撒密码算法示例
2018/04/12 Python
解决python升级引起的pip执行错误的问题
2018/06/12 Python
python递归全排列实现方法
2018/08/18 Python
详细介绍Python进度条tqdm的使用
2019/07/31 Python
使用Python实现正态分布、正态分布采样
2019/11/20 Python
pytorch使用 to 进行类型转换方式
2020/01/08 Python
opencv 图像礼帽和图像黑帽的实现
2020/07/07 Python
Java和Javasciprt的区别
2012/09/02 面试题
英语文学专业学生的自我评价
2013/10/31 职场文书
村干部承诺书
2014/03/28 职场文书
Python爬虫之爬取某文库文档数据
2021/04/21 Python
ztree+ajax实现文件树下载功能
2021/05/18 Javascript
Python基础之元编程知识总结
2021/05/23 Python
苹果M1芯片安装nginx 并且部署vue项目步骤详解
2021/11/20 Servers
Java 在线考试云平台的实现
2021/11/23 Java/Android
tomcat默认最大连接数及相关调整方法
2022/05/06 Servers