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实现周期性抓取网页内容的方法
Nov 04 Python
Python多维/嵌套字典数据无限遍历的实现
Nov 04 Python
Python中Django 后台自定义表单控件
Mar 28 Python
Python实现京东秒杀功能代码
May 16 Python
深入解析神经网络从原理到实现
Jul 26 Python
对Django中内置的User模型实例详解
Aug 16 Python
Python数据处理篇之Sympy系列(五)---解方程
Oct 12 Python
浅谈tensorflow中dataset.shuffle和dataset.batch dataset.repeat注意点
Jun 08 Python
Python正则re模块使用步骤及原理解析
Aug 18 Python
numpy中生成随机数的几种常用函数(小结)
Aug 18 Python
python 常见的反爬虫策略
Sep 27 Python
python 三种方法提取pdf中的图片
Feb 07 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 文件上传模型,支持多文件上传
2009/08/13 PHP
php字符编码转换之gb2312转为utf8
2013/10/28 PHP
php使用unset()删除数组中某个单元(键)的方法
2015/02/17 PHP
浅谈PHP中JSON数据操作
2015/07/01 PHP
讲解WordPress开发中一些常用的debug技巧
2015/12/18 PHP
PHP使用strtotime获取上个月、下个月、本月的日期
2015/12/30 PHP
php简单计算权重的方法示例【适合抽奖类应用】
2019/06/10 PHP
用js实现随机返回数组的一个元素
2007/08/13 Javascript
CLASS_CONFUSION JS混淆 全源码
2007/12/12 Javascript
js 距离某一时间点时间是多少实现代码
2013/10/14 Javascript
jQuery学习笔记之 Ajax操作篇(二) - 数据传递
2014/06/23 Javascript
jQuery动画出现连续触发、滞后反复执行的解决方法
2015/01/28 Javascript
js精美的幻灯片画集特效代码分享
2015/08/29 Javascript
javascript RegExp 使用说明
2016/05/21 Javascript
Bootstrap图片轮播组件Carousel使用方法详解
2016/10/20 Javascript
扩展jquery easyui tree的搜索树节点方法(推荐)
2016/10/28 Javascript
原生js实现回复评论功能
2017/01/18 Javascript
Nodejs实现短信验证码功能
2017/02/09 NodeJs
Angular之toDoList的实现代码示例
2017/12/02 Javascript
React组件内事件传参实现tab切换的示例代码
2018/07/04 Javascript
Vue多选列表组件深入详解
2021/03/02 Vue.js
Python随机生成一个6位的验证码代码分享
2015/03/24 Python
Python在Windows和在Linux下调用动态链接库的教程
2015/08/18 Python
Python中static相关知识小结
2018/01/02 Python
python-opencv颜色提取分割方法
2018/12/08 Python
关于Python-faker的函数效果一览
2019/11/28 Python
使用CSS实现弹性视频html5案例实践
2012/12/26 HTML / CSS
总经理岗位职责描述
2014/02/08 职场文书
远程研修随笔感言
2014/02/10 职场文书
《奇妙的国际互联网》 教学反思
2014/02/25 职场文书
宣传部部长竞选演讲稿
2014/04/26 职场文书
分公司负责人任命书
2014/06/04 职场文书
银行求职信范文怎么写
2015/03/20 职场文书
2015年除四害工作总结
2015/07/23 职场文书
2015年治庸问责工作总结
2015/07/27 职场文书
Nginx禁止ip访问或非法域名访问
2022/04/07 Servers