排序算法

"""
常用的排序算法实现,冒泡排序,插入排序,选择排序,归并排序,快速排序
"""
import sys


def bubbleSort(array, n):
    if n <= 1:
        return array
    for i in range(n):
        stopFlag = False
        for j in range(0, n - i - 1):
            if array[j] > array[j + 1]:
                array[j], array[j + 1] = array[j + 1], array[j]
                stopFlag = True
        if not stopFlag:
            return array
    return array


def insertSort(array, n):
    if n <= 1:
        return array
    for i in range(1, n):
        value = array[i]
        j = i - 1
        for j in reversed(range(j + 1)):
            if array[j] > value:
                array[j + 1] = array[j]
            else:
                break
        array[j + 1] = value
    return array


def selectSort(array, n):
    if n <= 1:
        return array
    for i in range(n):
        min_value = min(array[i:])
        array[i] = min_value
    return array


"""
递推公式:merge_sort(p..r) = merge(merge_sort(p..q),merge_sort(q+1,r))
终止条件:
p>=r
"""


def merge(A, p, q, r):
    tmp = list(range(r - p + 1))
    i, j, k = p, q + 1, 0
    while i <= q and j <= r:
        if A[i] <= A[j]:
            tmp[k] = A[i]
            k += 1
            i += 1
        else:
            tmp[k] = A[j]
            k += 1
            j += 1
    start, end = i, q
    if j <= r:
        start = j
        end = r
    while start <= end:
        tmp[k] = A[start]
        k += 1
        start += 1

    for i in range(r - p):
        A[p + i] = tmp[i]


def merge_sort_c(A, p, r):
    if p >= r:
        return
    q = (p + r) // 2
    merge_sort_c(A, p, q)
    merge_sort_c(A, q + 1, r)
    merge(A, p, q, r)
    return A


"""
递推公式:merge_sort(p..r) = merge(merge_sort(p..q),merge_sort(q+1,r))
终止条件:
p>=r
"""


def mergeSort(array, n):
    return merge_sort_c(array, 0, n - 1)


"""
递推公式:quick_sort(p..r) = quick_sort(p..q-1),quick_sort(q+1,r)
终止条件:
p>=r
"""


def partition(A, p, r):
    pivot = A[r]
    i = p
    for j in range(p, r + 1):
        if A[j] < pivot:
            A[i], A[j] = A[j], A[i]
            i += 1
    A[i], A[r] = A[r], A[i]
    return i


def quick_sort_c(A, p, r):
    if p >= r:
        return
    q = partition(A, p, r)
    quick_sort_c(A, p, q - 1)
    quick_sort_c(A, q + 1, r)
    return A


def quikSort(array, n):
    return quick_sort_c(array, 0, n - 1)


if __name__ == '__main__':
    sys.setrecursionlimit(1500)
    test_list = [4, 5, 6, 3, 2, 1]
    n = len(test_list)
    print(bubbleSort(test_list, n))
    print(insertSort(test_list, n))
    print(selectSort(test_list, n))
    print(mergeSort(test_list, n))
    print(quikSort(test_list, n))

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值