排序-五种排序


一、冒泡排序

代码示例

# 将乱序列表中最大元素排列到列表末尾位置
def m_sort(alist):
    for j in range(0, len(alist) - 1):
        if alist[j] > alist[j + 1]:
            temp = alist[j]
            alist[j] = alist[j + 1]
            alist[j + 1] = temp
    return alist

# 完整的冒泡排序
def m_sort_final(alist):
    for i in range(0, len(alist) - 1):
        for j in range(0, len(alist) - i - 1):
            if alist[j] > alist[j + 1]:
                temp = alist[j]
                alist[j] = alist[j + 1]
                alist[j + 1] = temp
    return alist

二、选择排序

代码示例

def selectionSort(alist):
    for i in range(len(alist) - 1, 0, -1):
        positionOfMax = 0
        for location in range(1, i + 1):
            if alist[location] > alist[positionOfMax]:
                positionOfMax = location

        temp = alist[i]
        alist[i] = alist[positionOfMax]
        alist[positionOfMax] = temp

alist = [54, 26, 93, 17, 77, 31, 44, 55, 20]
selectionSort(alist)
print(alist)

说明

选择排序通过减少交换次数来优化冒泡排序,通常在基准测试中表现更好。


三、插入排序

代码示例

# 完整的插入排序
def sort(alist):
    for i in range(1, len(alist)):
        while i > 0:
            if alist[i] < alist[i - 1]:
                alist[i], alist[i - 1] = alist[i - 1], alist[i]
                i -= 1
            else:
                break
    return alist

说明

插入排序的主要思想是每次取一个元素,将其插入到已排序部分的合适位置。


四、希尔排序

代码示例

# 希尔排序
def sort(alist):
    gap = len(alist) // 2
    while gap >= 1:
        for i in range(gap, len(alist)):
            while i > 0:
                if alist[i] < alist[i - gap]:
                    alist[i], alist[i - gap] = alist[i - gap], alist[i]
                    i -= gap
                else:
                    break
        gap //= 2
    return alist

说明

希尔排序是插入排序的改进版本,通过设置增量(gap)对子序列进行排序,逐步缩小增量,最终完成排序。


五、归并排序

代码示例

def merge_sort(alist):
    n = len(alist)
    if n <= 1:
        return alist
    mid = n // 2

    left_li = merge_sort(alist[:mid])
    right_li = merge_sort(alist[mid:])

    left_pointer, right_pointer = 0, 0
    result = []
    while left_pointer < len(left_li) and right_pointer < len(right_li):
        if left_li[left_pointer] < right_li[right_pointer]:
            result.append(left_li[left_pointer])
            left_pointer += 1
        else:
            result.append(right_li[right_pointer])
            right_pointer += 1

    result += left_li[left_pointer:]
    result += right_li[right_pointer:]

    return result

alist = [3, 8, 5, 7, 6]
print(merge_sort(alist))

说明

归并排序采用分治法,将列表不断分割为更小的子列表,然后逐步合并为有序列表。


六、快速排序

代码示例

# 快速排序
def sort(alist, start, end):
    low = start
    high = end
    if low > high:
        return
    mid = alist[low]

    while low < high:
        while low < high:
            if alist[high] > mid:
                high -= 1
            else:
                alist[low] = alist[high]
                break
        while low < high:
            if alist[low] < mid:
                low += 1
            else:
                alist[high] = alist[low]
                break

        if low == high:
            alist[low] = mid
            break

    sort(alist, start, high - 1)
    sort(alist, low + 1, end)

    return alist

# 测试代码
alist = [3, 8, 5, 7, 6]
sort(alist, 0, len(alist) - 1)
print(alist)

说明

快速排序通过选择基准值,将列表分为两部分,递归地对左右两部分进行排序。


posted @ 2021-07-13 15:25  杨梅杨梅  阅读(176)  评论(0)    收藏  举报