排序算法(Python实现)

排序算法(Python实现)

Posted by Reborn on March 15, 2019

排序算法(Python实现)

最近找实习,把之前用Java实现过排序算法,重新实现一下,当作复习。之前Java版实现的文章

冒泡排序

def bubbleSort(arr):
    if arr is None or len(arr) == 0:
        return []

    l = len(arr)
    for i in range(l - 1):
        for j in range(l - i - 1):
            if arr[j] > arr[j + 1]:
                arr[j], arr[j + 1] = arr[j + 1], arr[j]

    return arr

选择排序

def selectSort(arr):
    if arr is None or len(arr) == 0:
        return []

    l = len(arr)
    for i in range(l - 1):
        minIndex = i
        for j in range(i + 1, l):
            if arr[j] < arr[minIndex]:
                minIndex = j

        arr[i], arr[minIndex] = arr[minIndex], arr[i]

    return arr

插入排序

def insertSort(arr):
    if arr is None or len(arr) == 0:
        return []

    l = len(arr)
    for i in range(1, l):
        current = arr[i]
        preIndex = i - 1
        while preIndex >= 0 and arr[preIndex] > arr[i]:
            arr[preIndex + 1] = arr[preIndex]  # 后移
            preIndex -= 1

        arr[preIndex + 1] = current

    return arr

希尔排序

def shellSort(arr):
    if arr is None or len(arr) == 0:
        return []

    l = len(arr)
    h = 1
    while h < l/3:
        h = 3*h + 1

    while h>0:
        for i in range(h, l):
            for j in range(i, h-1, -1):
                if arr[j] < arr[j-h]:
                    arr[j], arr[j-h] = arr[j-h], arr[j]

        h = int(h/3)

    return arr

快速排序

def quickSort(arr, left, right):
    if left >= right:
        return

    partitionIndex = partition(arr, left, right)
    quickSort(arr, left, partitionIndex-1)
    quickSort(arr, partitionIndex, right)

    return arr

def partition(arr, left, right):
    pivot = arr[right]
    i = left
    for j in range(left, right):
        if arr[j] < pivot:
            arr[i], arr[j] = arr[j], arr[i]
            i += 1

    arr[i], arr[right] = arr[right], arr[i]

    return i

归并排序

归并排序,其实就是不断二分,然后二分排序好的子集进行合并

# 归并排序
def merge(arr, left, right):
    result = []  # 借助辅助空间
    mid = (left + right) >> 1
    leftIndex, rightIndex = left, mid + 1
    print("left: %s, right: %s, %s" % (left, right, arr[left: right+1]))
    while leftIndex <= mid and rightIndex <= right:
        # 用辅助空间
        if arr[leftIndex] < arr[rightIndex]:
            result.append(arr[leftIndex])
            leftIndex += 1
        else:
            result.append(arr[rightIndex])
            rightIndex += 1

    while leftIndex <= mid:
        result.append(arr[leftIndex])
        leftIndex += 1
    while rightIndex <= right:
        result.append(arr[rightIndex])
        rightIndex += 1

    for i in range(left, right+1):
        arr[i] = result[i-left]
    print("After sort, left: %s, right: %s, %s" % (left, right, arr[left: right + 1]))




def sort(arr, left, right):
    if left >= right:
        return
    mid = (left + right) // 2
    sort(arr, left, mid)
    sort(arr, mid + 1, right)
    merge(arr, left, right)


def mergeSort(arr, left, right):
    sort(arr, left, right)
    return arr

if __name__ == '__main__':
    mergeSort([3, 44, 38, 5, 47, 15, 26, 2, 46, 19, 50, 48], 0, 11)

结果展示

left: 0, right: 1, [3, 44]
After sort, left: 0, right: 1, [3, 44]
left: 0, right: 2, [3, 44, 38]
After sort, left: 0, right: 2, [3, 38, 44]
left: 3, right: 4, [5, 47]
After sort, left: 3, right: 4, [5, 47]
left: 3, right: 5, [5, 47, 15]
After sort, left: 3, right: 5, [5, 15, 47]
left: 0, right: 5, [3, 38, 44, 5, 15, 47]
After sort, left: 0, right: 5, [3, 5, 15, 38, 44, 47]
left: 6, right: 7, [26, 2]
After sort, left: 6, right: 7, [2, 26]
left: 6, right: 8, [2, 26, 46]
After sort, left: 6, right: 8, [2, 26, 46]
left: 9, right: 10, [19, 50]
After sort, left: 9, right: 10, [19, 50]
left: 9, right: 11, [19, 50, 48]
After sort, left: 9, right: 11, [19, 48, 50]
left: 6, right: 11, [2, 26, 46, 19, 48, 50]
After sort, left: 6, right: 11, [2, 19, 26, 46, 48, 50]
left: 0, right: 11, [3, 5, 15, 38, 44, 47, 2, 19, 26, 46, 48, 50]
After sort, left: 0, right: 11, [2, 3, 5, 15, 19, 26, 38, 44, 46, 47, 48, 50]