Python內排序

__author__ = 'IanHwang'
#  __coding:utf8__
# 冒泡排序
# 時間複雜度:O(n ^ 2)
# 穩定排序
def BubbleSort(array):
    for i in range(0, len(array)):
        flag = True
        for j in range(i, 0, -1):
            if(array[j] < array[j-1]):
                array[j], array[j-1] = array[j-1], array[j]
                flag = False
            if flag:
                break
    return array

# 選擇排序
# 時間複雜度:O(n ^ 2)
# 不穩定排序
def SelectSort(array):
    for i in range(0, len(array)):
        pMin = i
        for j in range(i + 1, len(array)):
            if (array[j] < array[pMin]):
                pMin = j
        if(pMin != i):
            array[pMin], array[i] = array[i], array[pMin]
    return array

# 插入排序
# 時間複雜度:O(n ^ 2)
# 穩定排序
def InsertSort(array):
    for i in range(0, len(array)):
        for j in range(i, 0, -1):
            if(array[j] < array[j-1]):
                array[j], array[j-1] = array[j-1], array[j]
    return array

# 快速排序
# 時間複雜度:好O(n * log(n)),壞O(n ^ 2)
# 不穩定排序
def QuickSort(array):
    quickSort(array, 0, len(array)-1)
    return array

def quickSort(array, left, right):
    if(left < right):
        pivotpos = partition(array, left, right)
        quickSort(array, left, pivotpos -1)
        quickSort(array, pivotpos +1, right)

def partition(array, left, right):
    if(left < right):
        pivotpos = left
        pivot = array[left]
        for i in range(left, right +1):
            if(array[i] < pivot):
                pivotpos += 1
                if(pivotpos != i):
                    array[pivotpos], array[i] = array[i], array[pivotpos]
        array[pivotpos], array[left] = array[left], array[pivotpos]
    return pivotpos

# 希爾排序
# 時間複雜度:O(n * log(n)) ---- O(n ^ 2)
# 不穩定排序
def ShellSort(array):
    delta = int(len(array)/2)
    while(delta > 0):
        for i in range(0, delta):
            for j in range(i + delta,len(array), delta):
                for k in range(j, 0, -1):
                    if(array[k] < array[k - delta]):
                        array[k], array[k - delta] = array[k - delta], array[k]
        delta = int(delta/ 2)
    return array

# 堆排序
# 時間複雜度:O(n * log(n))
# 不穩定排序
def exchange(array,i, j):
    x = array[i]
    array[i]=array[j]
    array[j]=x
def maxHeapify(array,end,i):
    l=2*i+1
    r=2*(i+1)
    max=i
    if l<end and array[i]<array[l]:
        max=l
    if r<end and array[max]<array[r]:
        max=r
    if max <> i:
        exchange(array,i,max)
        maxHeapify(array,end,max)
def buildMaxHeap(array):
    end=array.__len__()
    start=end/2-1
    for i in range(start,-1,-1):
        maxHeapify(array,end,i)
def HeapSort(array):
    end=array.__len__()
    buildMaxHeap(array)
    for i in range(end-1,0,-1):
        exchange(array,i,0)
        maxHeapify(array,i,0)

# 歸併排序
# 時間複雜度:O(n * log(n))
# 穩定排序
def MergeSort(arr):
    def marge(start, mid, end):
        leftLength = mid - start + 1
        rightLength = end - mid
        left = [0] * leftLength
        right = [0] * rightLength
        for i in range(0, leftLength):
            left[i] = arr[start + i]
        for j in range(0, rightLength):
            right[j] = arr[mid + j +1]
        i = j = 0
        k = start
        while i < leftLength and j < rightLength:
            if left[i] < right[j]:
                arr[k] = left[i]
                i += 1
            else:
                arr[k] = right[j]
                j += 1
            k += 1
        if i < leftLength:
            for i in range(i, leftLength):
                arr[k] = left[i]
                i += 1
                k += 1
        if j < rightLength:
            for j in range(j, rightLength):
                arr[k] = right[j]
                j += 1
                k += 1
    def sort(start, end):
        if start < end:
            mid = (end + start) // 2
            sort(start, mid)
            sort(mid+1, end)
            marge(start, mid, end)
    sort(0, len(arr)-1)

# 測試函數
arr = [9,8,7,6,5,4,3,2,1]
# BubbleSort(arr)
# SelectSort(arr)
# InsertSort(arr)
# QuickSort(arr)
# ShellSort(arr)
# HeapSort(arr)
# MergeSort(arr)
print(arr)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章