图文讲解选择排序算法的原理及在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编写android截屏脚本双击运行即可
Jul 21 Python
利用python获取Ping结果示例代码
Jul 06 Python
python利用sklearn包编写决策树源代码
Dec 21 Python
Django学习教程之静态文件的调用详解
May 08 Python
python将.ppm格式图片转换成.jpg格式文件的方法
Oct 27 Python
python初学者,用python实现基本的学生管理系统(python3)代码实例
Apr 10 Python
pytorch 输出中间层特征的实例
Aug 17 Python
pytorch中的上采样以及各种反操作,求逆操作详解
Jan 03 Python
浅谈python多线程和多线程变量共享问题介绍
Apr 17 Python
python爬虫工具例举说明
Nov 30 Python
Python从MySQL数据库中面抽取试题,生成试卷
Jan 14 Python
python解决OpenCV在读取显示图片的时候闪退的问题
Feb 23 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+SQL 注入攻击的技术实现以及预防办法
2011/01/27 PHP
php中ltrim()、rtrim()与trim()删除字符空格实例
2014/11/25 PHP
php准确获取文件MIME类型的方法
2015/06/17 PHP
Javascript开发包大全整理
2006/12/22 Javascript
jQuery下实现等待指定元素加载完毕(可改成纯js版)
2013/07/11 Javascript
jQuery选择器简明总结(含用法实例,一目了然)
2014/04/25 Javascript
jQuery实现的经典竖向伸缩菜单效果代码
2015/09/24 Javascript
跟我学习javascript的浮点数精度
2015/11/16 Javascript
分享使用AngularJS创建应用的5个框架
2015/12/05 Javascript
JavaScript如何实现对数字保留两位小数一位自动补零
2015/12/18 Javascript
jQuery ajax请求返回list数据动态生成input标签,并把list数据赋值到input标签
2016/03/29 Javascript
Bootstrap3 图片(响应式图片&amp;图片形状)
2017/01/04 Javascript
windows系统下更新nodejs版本的方案
2017/11/24 NodeJs
详解在HTTPS 项目中使用百度地图 API
2019/04/26 Javascript
基于Vue实现电商SKU组合算法问题
2019/05/29 Javascript
微信小程序实现折线图的示例代码
2019/06/07 Javascript
bootstrap table实现横向合并与纵向合并
2019/07/18 Javascript
vue el-table实现自定义表头
2019/12/11 Javascript
[40:50]2014 DOTA2国际邀请赛中国区预选赛 5 23 CIS VS LGD第四场
2014/05/24 DOTA
Python计算已经过去多少个周末的方法
2015/07/25 Python
django数据库migrate失败的解决方法解析
2018/02/08 Python
详解python tkinter教程-事件绑定
2019/03/28 Python
手动安装python3.6的操作过程详解
2020/01/13 Python
解决Tensorboard可视化错误:不显示数据 No scalar data was found
2020/02/15 Python
计算机毕业大学生推荐信
2013/12/01 职场文书
大学生职业规划范文:象牙塔生活的四年计划
2014/01/14 职场文书
创建市级文明单位实施方案
2014/03/01 职场文书
《动手做做看》教学反思
2014/04/09 职场文书
优秀大学生求职自荐信范文
2014/04/19 职场文书
机械设备与数控技术专业求职信
2014/08/10 职场文书
入党积极分子十八届四中全会思想汇报
2014/10/23 职场文书
走群众路线学习心得体会
2014/10/31 职场文书
财政局长个人总结
2015/03/04 职场文书
青春雷锋观后感
2015/06/10 职场文书
大学生创业,为什么都会选择快餐饮?
2019/08/08 职场文书
如何使用flask将模型部署为服务
2021/05/13 Python