图文讲解选择排序算法的原理及在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批量重命名同一文件夹下文件的方法
May 25 Python
python清除字符串里非数字字符的方法
Jul 02 Python
教大家使用Python SqlAlchemy
Feb 12 Python
Python 通过调用接口获取公交信息的实例
Dec 17 Python
python自定义函数实现一个数的三次方计算方法
Jan 20 Python
python贪吃蛇游戏代码
Apr 18 Python
Python多线程多进程实例对比解析
Mar 12 Python
python使用隐式循环快速求和的实现示例
Sep 11 Python
python -v 报错问题的解决方法
Sep 15 Python
python 实现朴素贝叶斯算法的示例
Sep 30 Python
用pip给python安装matplotlib库的详细教程
Feb 24 Python
Python使用华为API为图像设置多个锚点标签
Apr 12 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面向对象全攻略 (五) 封装性
2009/09/30 PHP
php输出xml格式字符串(用的这个)
2012/07/12 PHP
PHP中SESSION的注销与清除
2015/04/16 PHP
php ajax异步读取rss文档数据
2016/03/29 PHP
可以显示单图片,多图片ajax请求的ThickBox3.1类下载
2007/12/23 Javascript
js Flash插入函数免激活代码
2009/03/31 Javascript
javascript解三阶幻方(九宫格)
2015/04/22 Javascript
分享9点个人认为比较重要的javascript 编程技巧
2015/04/27 Javascript
最新最热最实用的15个jQuery插件汇总
2015/07/05 Javascript
Jquery uploadify上传插件使用详解
2016/01/13 Javascript
js/jquery控制页面动态加载数据 滑动滚动条自动加载事件的方法
2017/02/08 Javascript
浅析Vue 和微信小程序的区别、比较
2018/08/03 Javascript
layui结合form,table的全选、反选v1.0示例讲解
2018/08/15 Javascript
vue实现的双向数据绑定操作示例
2018/12/04 Javascript
jquery层次选择器的介绍
2019/01/18 jQuery
推荐15个最好用的JavaScript代码压缩工具
2019/02/13 Javascript
vue elementui el-form rules动态验证的实例代码详解
2019/05/23 Javascript
基于Vue实现电商SKU组合算法问题
2019/05/29 Javascript
webpack4.0+vue2.0利用批处理生成前端单页或多页应用的方法
2019/06/28 Javascript
Js图片点击切换轮播实现代码
2020/07/27 Javascript
详谈Vue.js框架下main.js,App.vue,page/index.vue之间的区别
2020/08/12 Javascript
[14:25]教你分分钟做大人:主宰(HEROS)
2014/12/08 DOTA
python操作mongodb根据_id查询数据的实现方法
2015/05/20 Python
Python性能提升之延迟初始化
2016/12/04 Python
[原创]教女朋友学Python3(二)简单的输入输出及内置函数查看
2017/11/30 Python
Python设计模式之职责链模式原理与用法实例分析
2019/01/11 Python
PyCharm License Activation激活码失效问题的解决方法(图文详解)
2020/03/12 Python
HTML5实现获取地理位置信息并定位功能
2015/04/25 HTML / CSS
美国著名的婴儿学步鞋老品牌:Robeez
2016/08/20 全球购物
Theory美国官网:后现代都市风时装品牌
2018/05/09 全球购物
英国领先的野生鸟类食品供应商:GardenBird
2018/08/09 全球购物
加拿大时装零售商:Influence U
2018/12/22 全球购物
建筑学专业自荐书
2014/07/09 职场文书
团队拓展活动总结
2014/08/27 职场文书
OpenCV3.3+Python3.6实现图片高斯模糊
2021/05/18 Python
正则表达式基础与常用验证表达式
2022/06/16 Javascript