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中使用urllib2获取http请求状态码的代码例子
Jul 07 Python
最大K个数问题的Python版解法总结
Jun 16 Python
Python自动发邮件脚本
Mar 31 Python
Python贪吃蛇游戏编写代码
Oct 26 Python
分析python请求数据
Aug 19 Python
基于python实现学生管理系统
Oct 17 Python
python 函数内部修改外部变量的方法
Dec 18 Python
python远程调用rpc模块xmlrpclib的方法
Jan 11 Python
Python环境Pillow( PIL )图像处理工具使用解析
Sep 12 Python
记录一下scrapy中settings的一些配置小结
Sep 28 Python
python 实时调取摄像头的示例代码
Nov 25 Python
Python实现我的世界小游戏源代码
Mar 02 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
推荐Discuz!5的PHP代码高亮显示与实现可运行代码
2007/03/15 PHP
PHP获取表单数据与HTML嵌入PHP脚本的实现
2017/02/09 PHP
jsp js鼠标移动到指定区域显示选项卡离开时隐藏示例
2013/06/14 Javascript
IE6下拉框图层问题探讨及解决
2014/01/03 Javascript
jQuery旋转木马式幻灯片轮播特效
2015/12/04 Javascript
正则 js分转元带千分符号详解
2017/03/08 Javascript
微信小程序实现选项卡功能
2020/06/19 Javascript
elementui的默认样式修改方法
2018/02/23 Javascript
详解JS中统计函数执行次数与执行时间
2018/09/04 Javascript
JavaScript继承的特性与实践应用深入详解
2018/12/30 Javascript
js实现3D照片墙效果
2019/10/28 Javascript
JS实现字体背景跑马灯
2020/01/06 Javascript
详解React 条件渲染
2020/07/08 Javascript
[01:09:50]VP vs Pain 2018国际邀请赛小组赛BO2 第二场
2018/08/20 DOTA
python实现进程间通信简单实例
2014/07/23 Python
python操作列表的函数使用代码详解
2017/12/28 Python
Python异常处理操作实例详解
2018/05/10 Python
基于python实现简单日历
2018/07/28 Python
Pandas删除数据的几种情况(小结)
2019/06/21 Python
使用Python为中秋节绘制一块美味的月饼
2019/09/11 Python
python队列原理及实现方法示例
2019/11/27 Python
使用python实现希尔、计数、基数基础排序的代码
2019/12/25 Python
Python opencv相机标定实现原理及步骤详解
2020/04/09 Python
Python json解析库jsonpath原理及使用示例
2020/11/25 Python
python urllib和urllib3知识点总结
2021/02/08 Python
移动Web—CSS为Retina屏幕替换更高质量的图片
2012/12/24 HTML / CSS
中国酒类在线零售网站:酒仙网
2016/08/20 全球购物
世界最大的票务市场:viagogo
2017/02/16 全球购物
巴西最大的在线约会网站:ParPerfeito
2018/07/11 全球购物
新加坡交友网站:be2新加坡
2019/04/10 全球购物
解释DataSet(ds) 和 ds as DataSet 的含义
2014/07/27 面试题
大学专科自荐信
2014/06/17 职场文书
建设幸福中国演讲稿
2014/09/11 职场文书
2014年办公室个人工作总结
2014/11/12 职场文书
windows系统安装配置nginx环境
2022/06/28 Servers
MySQL存储过程及语法详解
2022/08/05 MySQL