图文讲解选择排序算法的原理及在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标准库之sqlite3使用实例
Nov 25 Python
python实现用户登录系统
May 21 Python
Python中列表元素转为数字的方法分析
Jun 14 Python
深入浅析Python中的yield关键字
Jan 24 Python
python使用锁访问共享变量实例解析
Feb 08 Python
Python使用numpy产生正态分布随机数的向量或矩阵操作示例
Aug 22 Python
Python基于opencv实现的简单画板功能示例
Mar 04 Python
Python实现朴素贝叶斯的学习与分类过程解析
Aug 24 Python
小白教你PyCharm从下载到安装再到科学使用PyCharm2020最新激活码
Sep 25 Python
python更新数据库中某个字段的数据(方法详解)
Nov 18 Python
使用python画出逻辑斯蒂映射(logistic map)中的分叉图案例
Dec 11 Python
python自动计算图像数据集的RGB均值
Jun 18 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查看session内容的函数
2008/08/27 PHP
在Windows系统上安装PHP运行环境文字教程
2010/07/19 PHP
解析php中static,const与define的使用区别
2013/06/18 PHP
浅析php中常量,变量的作用域和生存周期
2013/08/10 PHP
PHP preg_match实现正则表达式匹配功能【输出是否匹配及匹配值】
2017/07/19 PHP
在php的yii2框架中整合hbase库的方法
2018/09/20 PHP
javascript学习笔记(五)正则表达式
2011/04/08 Javascript
js字符串转换成xml对象并使用技巧解读
2013/04/18 Javascript
jquery 删除字符串最后一个字符的方法解析
2014/02/11 Javascript
javascript对JSON数据排序的3个例子
2014/04/12 Javascript
node.js+Ajax实现获取HTTP服务器返回数据
2014/11/26 Javascript
jfinal与bootstrap的登录跳转实战演习
2015/09/22 Javascript
jquery中validate与form插件提交的方式小结
2016/03/26 Javascript
适用于手机端的jQuery图片滑块动画
2016/12/09 Javascript
vue中component组件的props使用详解
2017/09/04 Javascript
推荐15个最好用的JavaScript代码压缩工具
2019/02/13 Javascript
Vue数据驱动表单渲染,轻松搞定form表单
2019/07/19 Javascript
详细分析JavaScript中的深浅拷贝
2020/09/17 Javascript
原生JavaScript实现弹幕组件的示例代码
2020/10/12 Javascript
vue项目中使用rem,在入口文件添加内容操作
2020/11/11 Javascript
Django+uni-app实现数据通信中的请求跨域的示例代码
2019/10/12 Python
python颜色随机生成器的实例代码
2020/01/10 Python
浅谈keras使用预训练模型vgg16分类,损失和准确度不变
2020/07/02 Python
python 使用多线程创建一个Buffer缓存器的实现思路
2020/07/02 Python
Python3爬虫中Selenium的用法详解
2020/07/10 Python
浅谈anaconda python 版本对应关系
2020/10/07 Python
Paul Smith英国官网:英国国宝级时装品牌
2019/03/21 全球购物
英国露营设备和户外服装购物网站:Simply Hike
2019/05/05 全球购物
改变生活的男士内衣:SAXX Underwear
2019/08/28 全球购物
英国DIY和家居装饰领域的主要品牌:Wickes
2019/11/26 全球购物
日期和时间问题
2015/01/04 面试题
经典禁毒标语
2014/06/16 职场文书
应用心理学专业求职信
2014/08/04 职场文书
群众路线对照检查剖析材料
2014/10/09 职场文书
趣味运动会简讯
2015/07/20 职场文书
团队拓展训练心得体会
2016/01/12 职场文书