图文讲解选择排序算法的原理及在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的paramiko模块实现远程控制和传输示例
Oct 13 Python
python调用Delphi写的Dll代码示例
Dec 05 Python
python使用logging模块发送邮件代码示例
Jan 18 Python
对TensorFlow的assign赋值用法详解
Jul 30 Python
基于python框架Scrapy爬取自己的博客内容过程详解
Aug 05 Python
大家都说好用的Python命令行库click的使用
Nov 07 Python
Pycharm和Idea支持的vim插件的方法
Feb 21 Python
Ubuntu中配置TensorFlow使用环境的方法
Apr 21 Python
基于python实现计算两组数据P值
Jul 10 Python
Python实现图片查找轮廓、多边形拟合、最小外接矩形代码
Jul 14 Python
Scrapy-Redis之RedisSpider与RedisCrawlSpider详解
Nov 18 Python
Python 中 Shutil 模块详情
Nov 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 nl2br()格式化输出的详解
2013/06/05 PHP
PHP和JavaScrip分别获取关联数组的键值示例代码
2013/09/16 PHP
php旋转图片90度的方法
2013/11/07 PHP
php中smarty区域循环的方法
2015/06/11 PHP
PHP+MySQL之Insert Into数据插入用法分析
2015/09/27 PHP
另类调用flash无须激活的方法
2006/12/27 Javascript
调用js时ie6和ie7,ff的区别
2009/08/19 Javascript
11款新鲜的jQuery插件[附所有demo下载]
2011/01/24 Javascript
jquery中实现简单的tabs插件功能的代码
2011/03/02 Javascript
javascript实现上传图片并预览的效果实现代码
2011/04/11 Javascript
jquery学习笔记 用jquery实现无刷新登录
2011/08/08 Javascript
JS的参数传递示例介绍
2014/02/08 Javascript
使用jquery实现的一个图片延迟加载插件(含图片延迟加载原理)
2014/06/05 Javascript
javascript解三阶幻方(九宫格)
2015/04/22 Javascript
javascript通过获取html标签属性class实现多选项卡的方法
2015/07/27 Javascript
Web开发使用Angular实现用户密码强度判别的方法
2017/09/27 Javascript
layui添加动态菜单与选项卡 AJAX请求的例子
2019/09/25 Javascript
CentOS 8.2服务器上安装最新版Node.js的方法
2020/12/16 Javascript
[03:19]2016国际邀请赛中国区预选赛第四日TOP10镜头集锦
2016/07/01 DOTA
[52:41]OG vs IG 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/20 DOTA
[04:15]DOTA2-DPC中国联赛1月19日Recap集锦
2021/03/11 DOTA
Python单例模式实例分析
2015/01/14 Python
Python获取单个程序CPU使用情况趋势图
2015/03/10 Python
玩转python爬虫之cookie使用方法
2016/02/17 Python
基于python中pygame模块的Linux下安装过程(详解)
2017/11/09 Python
Python cookbook(数据结构与算法)将名称映射到序列元素中的方法
2018/03/22 Python
Python对excel文档的操作方法详解
2018/12/10 Python
python 判断文件还是文件夹的简单实例
2019/06/10 Python
利用HTML5+CSS3实现3D转换效果实例详解
2017/05/02 HTML / CSS
关于老式浏览器兼容HTML5和CSS3的问题
2016/06/01 HTML / CSS
农村婚礼证婚词
2014/01/08 职场文书
社团招新策划书
2014/02/04 职场文书
劳动竞赛活动总结
2014/05/05 职场文书
听课评课活动心得体会
2016/01/15 职场文书
2019年圣诞节祝福语集锦
2019/12/25 职场文书
nginx请求限制配置方法
2021/07/09 Servers