Python实现的几个常用排序算法实例


Posted in Python onJune 16, 2014

前段时间为准备百度面试恶补的东西,虽然最后还是被刷了,还是把那几天的“战利品”放点上来,算法一直是自己比较薄弱的地方,以后还要更加努力啊。

下面用Python实现了几个常用的排序,如快速排序,选择排序,以及二路并归排序等等。

#encoding=utf-8
import random
from copy import copy
def directInsertSort(seq):
 """ 直接插入排序 """
 size = len(seq)
 for i in range(1,size):
  tmp, j = seq[i], i
  while j > 0 and tmp < seq[j-1]:
   seq[j], j = seq[j-1], j-1
  seq[j] = tmp
 return seq
def directSelectSort(seq):
 """ 直接选择排序 """
 size = len(seq)
 for i in range(0,size - 1):
  k = i;j = i+1
  while j < size:
   if seq[j] < seq[k]:
    k = j
   j += 1
  seq[i],seq[k] = seq[k],seq[i]
 return seq
def bubbleSort(seq):
 """冒泡排序"""
 size = len(seq)
 for i in range(1,size):
  for j in range(0,size-i):
   if seq[j+1] < seq[j]:
    seq[j+1],seq[j] = seq[j],seq[j+1]
 return seq
def _divide(seq, low, high):
 """快速排序划分函数"""
 tmp = seq[low]
 while low != high:
  while low < high and seq[high] >= tmp: high -= 1
  if low < high:
   seq[low] = seq[high]
   low += 1
  while low < high and seq[low] <= tmp: low += 1
  if low < high:
   seq[high] = seq[low]
   high -= 1
 seq[low] = tmp
 return low
def _quickSort(seq, low, high):
 """快速排序辅助函数"""
 if low >= high: return
 mid = _divide(seq, low, high)
 _quickSort(seq, low, mid - 1)
 _quickSort(seq, mid + 1, high)
def quickSort(seq):
 """快速排序包裹函数"""
 size = len(seq)
 _quickSort(seq, 0, size - 1)
 return seq
def merge(seq, left, mid, right):
 tmp = []
 i, j = left, mid
 while i < mid and j <= right:
  if seq[i] < seq[j]:
   tmp.append(seq[i])
   i += 1
  else:
   tmp.append(seq[j])
   j += 1
 if i < mid: tmp.extend(seq[i:])
 if j <= right: tmp.extend(seq[j:])
 seq[left:right+1] = tmp[0:right-left+1]
def _mergeSort(seq, left, right):
 if left == right: 
  return
 else:
  mid = (left + right) / 2
  _mergeSort(seq, left, mid)
  _mergeSort(seq, mid + 1, right)
  merge(seq, left, mid+1, right)
#二路并归排序
def mergeSort(seq):
 size = len(seq)
 _mergeSort(seq, 0, size - 1)
 return seq
if __name__ == '__main__':
 s = [random.randint(0,100) for i in range(0,20)]
 print s
 print "\n"
 print directSelectSort(copy(s))
 print directInsertSort(copy(s))
 print bubbleSort(copy(s))
 print quickSort(copy(s))
 print mergeSort(copy(s))

运行结果如下:
E:\python_project\practice>sorting.py
[10, 47, 56, 76, 64, 84, 26, 8, 47, 51, 88, 81, 32, 95, 91, 29, 28, 69, 61, 45]

[8, 10, 26, 28, 29, 32, 45, 47, 47, 51, 56, 61, 64, 69, 76, 81, 84, 88, 91, 95]
[8, 10, 26, 28, 29, 32, 45, 47, 47, 51, 56, 61, 64, 69, 76, 81, 84, 88, 91, 95]
[8, 10, 26, 28, 29, 32, 45, 47, 47, 51, 56, 61, 64, 69, 76, 81, 84, 88, 91, 95]
[8, 10, 26, 28, 29, 32, 45, 47, 47, 51, 56, 61, 64, 69, 76, 81, 84, 88, 91, 95]
[8, 10, 26, 28, 29, 32, 45, 47, 47, 51, 56, 61, 64, 69, 76, 81, 84, 88, 91, 95]
Python 相关文章推荐
仅用50行代码实现一个Python编写的计算器的教程
Apr 17 Python
Python计算字符宽度的方法
Jun 14 Python
python中的字典操作及字典函数
Jan 03 Python
修复CentOS7升级Python到3.6版本后yum不能正确使用的解决方法
Jan 26 Python
selenium+python实现自动登录脚本
Apr 22 Python
关于django 数据库迁移(migrate)应该知道的一些事
May 27 Python
解决Python 中英文混输格式对齐的问题
Jul 16 Python
Python中GIL的使用详解
Oct 03 Python
Python中如何导入类示例详解
Apr 17 Python
tensorflow的ckpt及pb模型持久化方式及转化详解
Feb 12 Python
Python 删除List元素的三种方法remove、pop、del
Nov 16 Python
详解java调用python的几种用法(看这篇就够了)
Dec 10 Python
Python中文件遍历的两种方法
Jun 16 #Python
Python里隐藏的“禅”
Jun 16 #Python
Python程序设计入门(5)类的使用简介
Jun 16 #Python
Python程序设计入门(4)模块和包
Jun 16 #Python
Python程序设计入门(3)数组的使用
Jun 16 #Python
Python程序设计入门(2)变量类型简介
Jun 16 #Python
Python程序设计入门(1)基本语法简介
Jun 13 #Python
You might like
缅甸的咖啡简史
2021/03/04 咖啡文化
php图片处理:加水印、缩略图的实现(自定义函数:watermark、thumbnail)
2010/12/02 PHP
PHP工程师VIM配置分享
2015/12/15 PHP
php版微信自定义回复功能示例
2016/12/05 PHP
php实现微信公众号企业转账功能
2018/10/01 PHP
PHP使用HTML5 FormData对象提交表单操作示例
2019/07/02 PHP
解决火狐浏览器下JS setTimeout函数不兼容失效不执行的方法
2012/11/14 Javascript
2012年开发人员的16款新鲜的jquery插件体验分享
2012/12/28 Javascript
checkbox勾选判断代码分析
2014/06/11 Javascript
JavaScript子窗口调用父窗口变量和函数的方法
2015/10/09 Javascript
Javascript基础教程之比较null和undefined值
2016/05/16 Javascript
jQuery实现的简单拖拽功能示例
2016/09/13 Javascript
javascript将非数值转换为数值
2018/09/13 Javascript
微信小程序全局变量功能与用法详解
2019/01/22 Javascript
Vue.js + Nuxt.js 项目中使用 Vee-validate 表单校验
2019/04/22 Javascript
解决vue-cli@3.xx安装不成功的问题及搭建ts-vue项目
2020/02/09 Javascript
深入理解webpack process.env.NODE_ENV配置
2020/02/23 Javascript
Javascript查看大图功能代码实现
2020/05/07 Javascript
JavaScript实现页面高亮操作提示和蒙板
2021/01/04 Javascript
linux服务器快速卸载安装node环境(简单上手)
2021/02/22 Javascript
[37:35]DOTA2上海特级锦标赛A组资格赛#1 Secret VS MVP.Phx第二局
2016/02/25 DOTA
对python制作自己的数据集实例讲解
2018/12/12 Python
在Pycharm中对代码进行注释和缩进的方法详解
2019/01/20 Python
Python Process多进程实现过程
2019/10/22 Python
pytorch 实现模型不同层设置不同的学习率方式
2020/01/06 Python
Python restful框架接口开发实现
2020/04/13 Python
Python格式化输出--%s,%d,%f的代码解析
2020/04/29 Python
基于SQLAlchemy实现操作MySQL并执行原生sql语句
2020/06/10 Python
adidas澳大利亚官方网站:adidas Australia
2018/04/15 全球购物
我能否用void** 指针作为参数, 使函数按引用接受一般指针
2013/02/16 面试题
师范大学毕业自我鉴定
2013/11/21 职场文书
师德学习感言
2014/01/31 职场文书
老公给老婆的保证书
2014/04/28 职场文书
java Nio使用NioSocket客户端与服务端交互实现方式
2021/06/15 Java/Android
Java spring单点登录系统
2021/09/04 Java/Android
Nginx进程调度问题详解
2021/09/25 Servers