python实现的各种排序算法代码


Posted in Python onMarch 04, 2013
# -*- coding: utf-8 -*-
# 测试各种排序算法
# link:3water.com
# date:2013/2/2
#选择排序
def select_sort(sort_array):
    for i, elem in enumerate(sort_array):
        for j, elem in enumerate(sort_array[i:]):
            if sort_array[i] > sort_array[j + i]:
                #交换
                sort_array[i], sort_array[j + i] = sort_array[j + i], sort_array[i]
#冒泡排序
def bubble_sort(sort_array):
    for i, elem in enumerate(sort_array):
        for j, elem in enumerate(sort_array[:len(sort_array) - i - 1]):
            if sort_array[j] > sort_array[j + 1]:
                sort_array[j], sort_array[j + 1] = sort_array[j + 1], sort_array[j]
#插入排序
def insert_sort(sort_array):
    for i, elem in enumerate(sort_array):
        for j, elem in enumerate(sort_array[:i]):
            if sort_array[j] > sort_array[i]:
                sort_array.insert(j, sort_array[i])
                del sort_array[i + 1]
#归并排序
def merge_sort_wrapper(sort_array):
    merge_sort(sort_array, 0, len(sort_array) - 1)
def merge_sort(sort_array, left = 0, right = 0):
    if left < right:
        center = (left + right) / 2
        merge_sort(sort_array, left, center)
        merge_sort(sort_array, center + 1, right)
        merge(sort_array, left, right, center)
def merge(sort_array, left, right, center):
    result = []
    arrayA = sort_array[left:center + 1]
    arrayB = sort_array[center + 1:right + 1]
    while((len(arrayA) > 0) and (len(arrayB) > 0)):
        if(arrayA[0] > arrayB[0]):
            result.append(arrayB.pop(0))
        else:
            result.append(arrayA.pop(0))
    if(len(arrayA) > 0):
        result.extend(arrayA)
    if(len(arrayB) > 0):
        result.extend(arrayB)   
    sort_array[left:right + 1] = result
#快排    
def quick_sort(sort_array):
    if(len(sort_array) < 2):
        return
    left = [x for x in sort_array[1:] if x < sort_array[0]]
    right = [x for x in sort_array[1:] if x >= sort_array[0]]
    quick_sort(left)
    quick_sort(right)
    sort_array[:] = left + [sort_array[0]] + right
#shell排序
def shell_sort(sort_array):
    dist=len(sort_array)/2  
    while dist > 0:  
        for i in range(dist,len(sort_array)):  
            tmp=sort_array[i]  
            j = i  
            while j >= dist and tmp < sort_array[j - dist]:  
                sort_array[j] = sort_array[j - dist]  
                j -= dist  
            sort_array[j] = tmp  
        dist /= 2  
#基数排序,均为整数,不支持负数和重复
def radix_sort(sort_array):
    max_elem = max(sort_array)
    bucket_list = []
    for i in range(max_elem):
        bucket_list.insert(i, 0)
    for x in sort_array:
        bucket_list[x - 1] = -1
    sort_array[:] = [x + 1 for x in range(len(bucket_list)) if bucket_list[x] == -1]
#堆排序
def heap_sort(sort_array):
   #没有写出来,再想想
   pass
#测试例子
def algo_sort_test(sort_array, sort_method):
    sort_method(sort_array)
if __name__ == '__main__':
    sort_array = [1, 2, 3, 5, -4, 4, 10, 3, 19, 13, 16, 18, 5, 190, 456, 23]
    algo_sort_test(sort_array, select_sort)
    print sort_array
    sort_array = [1, 2, 3, 5, -4, 4, 10, 3, 19, 13, 16, 18, 5, 190, 456, 23]
    algo_sort_test(sort_array, bubble_sort)
    print sort_array    
    sort_array = [1, 2, 3, 5, -4, 4, 10, 3, 19, 13, 16, 18, 5, 190, 456, 23]
    algo_sort_test(sort_array, insert_sort)
    print sort_array      
    sort_array = [1, 2, 3, 5, -4, 4, 10, 3, 19, 13, 16, 18, 5, 190, 456, 23]
    algo_sort_test(sort_array, merge_sort_wrapper)
    print sort_array
    sort_array = [1, 2, 3, 5, -4, 4, 10, 300, 19, 13, 16, 18, 500, 190, 456, 23]
    algo_sort_test(sort_array, quick_sort)
    print sort_array  
    sort_array = [1, 2, 3, 5, -4, 4, 10, 3, 19, 13, 16, 18, 5, 190, 456, 23]
    algo_sort_test(sort_array, shell_sort)
    print sort_array       
    sort_array = [1, 2, 3, 5, 4, 10, 19, 13, 16, 18, 190, 456, 23]
    algo_sort_test(sort_array, radix_sort)
    print sort_array       
    print 'OK'

非常基础的知识内容,选择、冒泡、插入、归并、基数,还有快排都能手写出来,但写了一遍发现堆排序忘了怎么做了。要复习啦。

Python 相关文章推荐
用Python和MD5实现网站挂马检测程序
Mar 13 Python
用Python编写分析Python程序性能的工具的教程
Apr 01 Python
python妹子图简单爬虫实例
Jul 07 Python
tensorflow saver 保存和恢复指定 tensor的实例讲解
Jul 26 Python
用Python实现数据的透视表的方法
Nov 16 Python
Python设计模式之组合模式原理与用法实例分析
Jan 11 Python
对DataFrame数据中的重复行,利用groupby累加合并的方法详解
Jan 30 Python
不到20行实现Python代码即可制作精美证件照
Apr 24 Python
keras实现图像预处理并生成一个generator的案例
Jun 17 Python
python3实现飞机大战
Nov 29 Python
Python之京东商品秒杀的实现示例
Jan 06 Python
Python djanjo之csrf防跨站攻击实验过程
May 14 Python
python 获取本机ip地址的两个方法
Feb 25 #Python
把大数据数字口语化(python与js)两种实现
Feb 21 #Python
python正则表达式修复网站文章字体不统一的解决方法
Feb 21 #Python
Python操作Mysql实例代码教程在线版(查询手册)
Feb 18 #Python
python的常见命令注入威胁
Feb 18 #Python
centos下更新Python版本的步骤
Feb 12 #Python
Python3.x和Python2.x的区别介绍
Feb 12 #Python
You might like
php文件怎么打开 如何执行php文件
2011/12/21 PHP
php操作xml入门之xml基本介绍及xml标签元素
2015/01/23 PHP
PHP性能分析工具XHProf安装使用教程
2015/05/13 PHP
PHP简单实现无限级分类的方法
2016/05/13 PHP
PHP判断文件是否被引入的方法get_included_files用法示例
2016/11/29 PHP
Expandable &quot;Detail&quot; Table Rows
2007/08/29 Javascript
JavaScript的类型简单说明
2010/09/03 Javascript
使用JQuery实现Ctrl+Enter提交表单的方法
2015/10/22 Javascript
Bootstrap入门书籍之(一)排版
2016/02/17 Javascript
如何用JavaScript实现动态修改CSS样式表
2016/05/20 Javascript
深入浅出ES6新特性之函数默认参数和箭头函数
2016/08/01 Javascript
vue.js中npm安装教程图解
2018/04/10 Javascript
JavaScript实现秒杀时钟倒计时
2019/09/29 Javascript
layui实现form表单同时提交数据和文件的代码
2019/10/25 Javascript
[01:54]TI4西雅图DOTA2选手欢迎晚宴 现场报道
2014/07/08 DOTA
[15:20]DOTA2-DPC中国联赛 正赛 Elephant vs Aster 选手采访
2021/03/11 DOTA
python简单获取本机计算机名和IP地址的方法
2015/06/03 Python
python学习基础之循环import及import过程
2018/04/22 Python
django js实现部分页面刷新的示例代码
2018/05/28 Python
python高阶爬虫实战分析
2018/07/29 Python
Django框架 Pagination分页实现代码实例
2019/09/04 Python
pygame库实现俄罗斯方块小游戏
2019/10/29 Python
python实现字典嵌套列表取值
2019/12/16 Python
CSS3支持IE6, 7, and 8的边框border属性
2012/12/28 HTML / CSS
HTML5 与 XHTML2
2008/10/17 HTML / CSS
医学生实习自荐信
2013/10/01 职场文书
幼儿园五一劳动节活动总结
2015/02/09 职场文书
2015年世界无烟日活动方案
2015/05/04 职场文书
同意报考证明
2015/06/17 职场文书
毕业证明书
2015/06/19 职场文书
血轮眼轮回眼特效 html+css
2021/03/31 HTML / CSS
ElementUI实现el-form表单重置功能按钮
2021/07/21 Javascript
python数字转对应中文的方法总结
2021/08/02 Python
JavaScript展开运算符和剩余运算符的区别详解
2022/02/18 Javascript
JAVA 线程池(池化技术)的实现原理
2022/04/28 Java/Android
tree shaking对打包体积优化及作用
2022/07/07 Java/Android