图文讲解选择排序算法的原理及在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是编译运行的验证方法
Jan 30 Python
Python EOL while scanning string literal问题解决方法
Sep 18 Python
举例讲解Python编程中对线程锁的使用
Jul 12 Python
详细介绍Python的鸭子类型
Sep 12 Python
初学python的操作难点总结(新手必看篇)
Aug 03 Python
Python KMeans聚类问题分析
Feb 23 Python
python读取文件名称生成list的方法
Apr 27 Python
使用Python制作简单的小程序IP查看器功能
Apr 16 Python
python判断链表是否有环的实例代码
Jan 31 Python
Python Opencv轮廓常用操作代码实例解析
Sep 01 Python
python zip()函数的使用示例
Sep 23 Python
python爬取招聘要求等信息实例
Nov 20 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
dedecms 批量提取第一张图片最为缩略图的代码(文章+软件)
2009/10/29 PHP
一个经典的PHP文件上传类分享
2014/11/18 PHP
PHP二维数组去重实例分析
2016/11/18 PHP
laravel 5.3中自定义加密服务的方案详解
2017/05/09 PHP
PHP+Ajax简单get验证操作示例
2019/03/02 PHP
CCPry JS类库 代码
2009/10/30 Javascript
风吟的小型JavaScirpt库 (FY.JS).
2010/03/09 Javascript
javascript 文章截取部分无损html显示实现代码
2010/05/04 Javascript
基于JQuery的简单实现折叠菜单代码
2010/09/15 Javascript
JS简单实现登陆验证附效果图
2013/11/19 Javascript
jquery 实现返回顶部功能
2014/11/17 Javascript
javascript中定义类的方法详解
2015/02/10 Javascript
jQuery仿Flash上下翻动的中英文导航菜单实例
2015/03/10 Javascript
nodejs开发微博实例
2015/03/25 NodeJs
Bootstrap与KnockoutJs相结合实现分页效果实例详解
2016/05/03 Javascript
手机端图片缩放旋转全屏查看PhotoSwipe.js插件实现
2016/08/25 Javascript
前端html中jQuery实现对文本的搜索功能并把搜索相关内容显示出来
2017/11/14 jQuery
vue 通过下拉框组件学习vue中的父子通讯
2017/12/19 Javascript
Vue cli+mui 区域滚动的实例代码
2018/01/25 Javascript
javascript代码优化的8点总结
2018/01/29 Javascript
JS实现秒杀倒计时特效
2020/01/02 Javascript
[05:39]2014DOTA2西雅图国际邀请赛 淘汰赛7月14日TOPPLAY
2014/07/14 DOTA
[15:20]DOTA2-DPC中国联赛 正赛 Elephant vs Aster 选手采访
2021/03/11 DOTA
python字符串过滤性能比较5种方法
2017/06/22 Python
Python enumerate索引迭代代码解析
2018/01/19 Python
利用Python在一个文件的头部插入数据的实例
2018/05/02 Python
使用Python控制摄像头拍照并发邮件
2019/04/23 Python
python单例模式原理与创建方法实例分析
2019/10/26 Python
pytorch 状态字典:state_dict使用详解
2020/01/17 Python
优秀团员事迹材料1000字
2014/08/20 职场文书
工作证明英文模板
2014/10/21 职场文书
2015年度员工自我评价范文
2015/03/11 职场文书
怎样写观后感
2015/06/19 职场文书
学习经验交流会演讲稿
2015/11/02 职场文书
2016新年晚会开场白
2015/12/03 职场文书
SQL Server中的逻辑函数介绍
2022/05/25 SQL Server