python排序算法

from random import randint

def bubbleSort(aList):
    length = len(aList)
    for i in range(length-1):
        for j in range(i+1, length):
            if aList[i] > aList[j]:
                aList[i], aList[j] = aList[j], aList[i]
    return aList

def quickSort(aList):
    if len(aList) <= 1:
        return aList
    return quickSort([i for i in aList[1:] if i < aList[0]]) + [aList[0]] + quickSort([i for i in aList[1:] if i >= aList[0]])

def selectSort(aList):
    length = len(aList)
    for i in range(length-1):
        idx = i
        for j in range(i+1, length):
            if aList[idx] > aList[j]:
                idx = j
        if idx != i:
            aList[i], aList[idx] = aList[idx], aList[i]
    return aList

def insertSort(aList):
    length = len(aList)

    for i in range(1, length):
        for j in range(i-1, -1, -1):
            if aList[i] < aList[j]:
                aList[i], aList[j] = aList[j], aList[i]
                i = j
    
    return aList

def shellSort(aList):
    length = len(aList)
    step = length // 2

    while step > 0:
        for i in range(step, length):  
            while i >= step and aList[i-step] > aList[i]:
                aList[i-step] , aList[i] = aList[i], aList[i-step]
                i -= step
            
        step //= 2
    
    return aList

def mergeSort(left, right):
    result = []
    left_idx = right_idx = 0
    left_len, right_len = len(left), len(right)

    while left_idx < left_len and right_idx < right_len:
        if left[left_idx] < right[right_idx]:
            result.append(left[left_idx])
            left_idx += 1
        else:
            result.append(right[right_idx])
            right_idx += 1
    
    while left_idx < left_len:
        result.append(left[left_idx])
        left_idx += 1
    
    while right_idx < right_len:
        result.append(right[right_idx])
        right_idx += 1
    
    return result

def merge(aList):
    mid = len(aList) // 2

    if len(aList) <= 1:
        return aList
    
    return mergeSort(merge(aList[:mid]), merge(aList[mid:]))

def heapSink(aList, length, parent):
    child_idx = 2 * parent + 1

    while child_idx < length:
        if child_idx + 1 < length and aList[child_idx] < aList[child_idx+1]:
            child_idx = child_idx + 1
        
        if aList[parent] < aList[child_idx]:
            aList[parent], aList[child_idx] = aList[child_idx], aList[parent]
            heapSink(aList, length, child_idx)
        else:
            break

def heapSort(aList):
    length = len(aList)
    for i in range(length//2, -1, -1):
        heapSink(aList, length, i)
    
    for i in range(length-1, 0, -1):
        aList[0], aList[i] = aList[i], aList[0]
        heapSink(aList, i, 0)
    
    return aList

def countingSort(aList):
    sorted_list = [0] * (max(aList) + 1)
    for i in aList:
        sorted_list[i] += 1
    
    temp = []
    for i, j in enumerate(sorted_list):
        while j > 0:
            temp.append(i)
            j -= 1
    return temp

def bucketSort(aList, bucketSize=10):
    maxNum = max(aList)
    bucketList = [ [] for i in range(bucketSize+1) ]
    for i in aList:
        bucketList[i//bucketSize].append(i)
    
    aList = []
    for i in bucketList:
        if i:
            aList.extend(insertSort(i))
    
    return aList

def radixSort(aList):
    for i in range(len(str(max(aList)))):
        tmpList = [ [] for i in range(10) ]
        
        for j in aList:
            tmpList[(j//10**i)%10].append(j)
        aList = []
        for k in tmpList:
            if k:
                aList.extend(k)
    return aList


if __name__ == '__main__':
    methods = [bubbleSort, quickSort, selectSort, insertSort, shellSort, heapSort, merge, countingSort, bucketSort, radixSort]

    for fn in methods:
        alist = [ randint(1, 100) for i in range(10) ]
        print('*' * 10 + str(fn) + '*' * 10)
        print(alist)
        print(fn(alist))
        print('*' * 20)

 

上一篇:python 快速排序


下一篇:Collections工具类