Python的多种风格快速排序案例

来源:互联网 发布:科蒂斯控软件连接 编辑:程序博客网 时间:2024/05/11 12:05

快速排序由C. A. R. Hoare在1962年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列

设要排序的数组是A[0]……A[N-1],首先任意选取一个数据(通常选用数组的第一个数)作为关键数据,然后将所有比它小的数都放到它前面,所有比它大的数都放到它后面,这个过程称为一趟快速排序。值得注意的是,快速排序不是一种稳定的排序算法,也就是说,多个相同的值的相对位置也许会在算法结束时产生变动。



#快排详解注释

def quickSort(arr):

    less = [] #小的列表
    pivotList = [] #中心列表
    more = [] #大的列表


    if len (arr) <= 1: #列表长度不小于等于1
        return "sort list len <= 1\n"   #小于等于1则报错


    else: #列表大于一
        pivot = arr[0] #原列表第一个值赋值给 中心值
        for i in arr: #把列表循环赋值给i
            if i < pivot: #i小于中心值
                less.append (i) #把i添加进小的列表里
            elif i > pivot: #i大于中间值
                more.append (i) #把i添加进大的列表里
            else: #i等于中心值
                pivotList.append (i) #把i添加进中心列表


        less = quickSort (less) #递归小的列表,排序小的列表里面的顺序
        more = quickSort (more) #递归大的列表,排序大的列表里面的顺序
        return less + pivotList + more #返回三个列表的组合



#简短的快排

def qsort(L):
    return (qsort ([y for y in L[1:] if y < L[0]]) +
            L[:1] +
            qsort ([y for y in L[1:] if y >= L[0]])) if len (L) > 1 else L


#简短的快排易读版

def qsort2(list):
    if not list:
        return []
    else:
        pivot = list[0]
        less = [x for x in list     if x <  pivot]
        more = [x for x in list[1:] if x >= pivot]
        return qsort2(less) + [pivot] + qsort2(more)



#其他风格的快排1
from random import *

def qSort(a):
    if len (a) <= 1:
        return a
    else:
        q = choice (a)
        return qSort ([elem for elem in a if elem < q]) + [q] * a.count (q) + qSort ([elem for elem in a if elem > q])


#其他风格快排2
def quickSort(a):
    if len (a) <= 1:
        return a
    else:
        less = []
        more = []
        pivot = choice (a)
        for i in a:
            if i < pivot:
                less.append (i)
            if i > pivot:
                more.append (i)
        less = quickSort (less)
        more = quickSort (more)
        return less + [pivot] * a.count (pivot) + more


#该快排指定环境为python 3 
def Qsort(array):
    if len(array) < 2:
        return array
    head,*tail = array
    less = Qsort([i for i in tail if i < head])
    more = Qsort([i for i in tail if i >= head])
    return less + [head] + more


#其他风格快排3

def quicksort(array):
    _quicksort(array, 0, len(array) - 1)
    return array


def _quicksort(array, start, stop):
    if stop - start > 0:
        pivot, left, right = array[start], start, stop
        while left <= right:
            while array[left] < pivot:
                left += 1
            while array[right] > pivot:
                right -= 1
            if left <= right:
                array[left], array[right] = array[right], array[left]
                left += 1
                right -= 1
        _quicksort(array, start, right)
        _quicksort(array, left, stop)
    return 0



#测试代码
a = [4, 65, 2, -31, 0, 99, 83, 782, 1]
# a = quickSort (a)
#a = qsort(a)
#a = qsort2(a)
#a = qSort(a)
#a = quickSort(a)
#a = Qsort(a)
a = quicksort(a)

print (a)
原创粉丝点击