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获取当前时间对应unix时间戳的方法
May 15 Python
python实现备份目录的方法
Aug 03 Python
Python的collections模块中namedtuple结构使用示例
Jul 07 Python
Python登录并获取CSDN博客所有文章列表代码实例
Dec 28 Python
Python中asyncio模块的深入讲解
Jun 10 Python
Django框架 querySet功能解析
Sep 04 Python
多版本python的pip 升级后, pip2 pip3 与python版本失配解决方法
Sep 11 Python
python tkinter组件使用详解
Sep 16 Python
numpy ndarray 取出满足特定条件的某些行实例
Dec 05 Python
python 实现图像快速替换某种颜色
Jun 04 Python
Python监听剪切板实现方法代码实例
Nov 11 Python
Tensorflow与RNN、双向LSTM等的踩坑记录及解决
May 31 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
fleaphp crud操作之find函数的使用方法
2011/04/23 PHP
js 未结束的字符串常量错误解决方法
2010/06/13 Javascript
ExtJS4给Combobox设置列表中的默认值示例
2014/05/02 Javascript
jquery 取子节点及当前节点属性值
2014/07/25 Javascript
JS+CSS实现滑动切换tab菜单效果
2015/08/25 Javascript
浅谈Nodejs观察者模式
2015/10/13 NodeJs
基于jquery实现下拉框美化特效
2016/02/02 Javascript
AngularJS教程之简单应用程序示例
2016/08/16 Javascript
微信小程序 wx.request(object) API详解及实例代码
2016/09/30 Javascript
原生JS实现图片网格式渐显、渐隐效果
2017/06/05 Javascript
Vue2.0用 watch 观察 prop 变化(不触发)
2017/09/08 Javascript
使用vue-router完成简单导航功能【推荐】
2018/06/28 Javascript
JS/HTML5游戏常用算法之碰撞检测 包围盒检测算法详解【矩形情况】
2018/12/13 Javascript
详解mpvue中小程序自定义导航组件开发指南
2019/02/11 Javascript
vue cli 3.0 搭建项目的图文教程
2019/05/17 Javascript
vue组件暴露和.js文件暴露接口操作
2020/08/11 Javascript
[01:06]DOTA2小知识课堂 Ep.02 吹风竟可解梦境缠绕
2019/12/05 DOTA
[40:53]完美世界DOTA2联赛PWL S3 Magma vs DLG 第二场 12.18
2020/12/20 DOTA
Python中的魔法方法深入理解
2014/07/09 Python
python不换行之end=与逗号的意思及用途
2017/11/21 Python
判断python字典中key是否存在的两种方法
2018/08/10 Python
Win10下python3.5和python2.7环境变量配置教程
2018/09/18 Python
PyQt4 treewidget 选择改变颜色,并设置可编辑的方法
2019/06/17 Python
pyqt弹出新对话框,以及关闭对话框获取数据的实例
2019/06/18 Python
python for循环remove同一个list过程解析
2019/08/14 Python
python可视化实现KNN算法
2019/10/16 Python
python统计文章中单词出现次数实例
2020/02/27 Python
python函数map()和partial()的知识点总结
2020/05/26 Python
使用HTML5 Canvas绘制直线或折线等线条的方法讲解
2016/03/14 HTML / CSS
Snapfish爱尔兰:在线照片打印和个性化照片礼品
2018/09/17 全球购物
旅游与酒店管理的自我评价分享
2013/11/03 职场文书
小学评语大全
2014/04/22 职场文书
2014年祖国生日寄语
2014/09/19 职场文书
领导班子民主生活会整改措施(工商局)
2014/09/21 职场文书
详解Java线程池是如何重复利用空闲线程的
2021/06/26 Java/Android
Mysql忘记密码解决方法
2022/02/12 MySQL