欢迎这位怪蜀黍来到《python之(26)中级总结(4)九大排序 - 大码王 - 博客园》

关闭页面特效

1、冒泡排序

复制代码
#   冒泡排序
def bubbleSort(arr):
    for i in range(1, len(arr)):
        for j in range(0, len(arr) - i):
            if arr[j] > arr[j + 1]:
                arr[j], arr[j + 1] = arr[j + 1], arr[j]
    return arr


#   冒泡排序反向遍历
def bubbleReverseSort(arr):
    # 反向遍历
    for i in range(len(arr) - 1, 0, -1):
        for j in range(0, i):
            if arr[j] > arr[j + 1]:
                arr[j], arr[j + 1] = arr[j + 1], arr[j]
    return arr
复制代码

2、桶排序

复制代码
# 桶排序
def bucket_sort_simplify(arr, max_num):
    """
    简化版
    """
    buf = {i: [] for i in range(int(max_num) + 1)}  # 不能使用[[]]*(max+1),这样新建的空间中各个[]是共享内存的
    arr_len = len(arr)
    for i in range(arr_len):
        num = arr[i]
        buf[int(num)].append(num)  # 将相应范围内的数据加入到[]中
    arr = []
    for i in range(len(buf)):
        if buf[i]:
            arr.extend(sorted(buf[i]))  # 这里还需要对一个范围内的数据进行排序,然后再进行输出
    return arr
复制代码

3、堆排序

复制代码
import math
# 堆排序
def buildMaxHeap(arr):
    for i in range(math.floor(len(arr) / 2), -1, -1):
        heapify(arr, i)


def heapify(arr, i):
    left = 2 * i + 1
    right = 2 * i + 2
    largest = i
    if left < arrLen and arr[left] > arr[largest]:
        largest = left
    if right < arrLen and arr[right] > arr[largest]:
        largest = right

    if largest != i:
        swap(arr, i, largest)
        heapify(arr, largest)


def swap(arr, i, j):
    arr[i], arr[j] = arr[j], arr[i]


def heapSort(arr):
    global arrLen
    arrLen = len(arr)
    buildMaxHeap(arr)
    for i in range(len(arr) - 1, 0, -1):
        swap(arr, 0, i)
        arrLen -= 1
        heapify(arr, 0)
    return arr
复制代码

4、计数排序

复制代码
# 计数排序
def countingSort(arr, maxValue):
    bucketLen = maxValue + 1
    bucket = [0] * bucketLen
    sortedIndex = 0
    arrLen = len(arr)
    for i in range(arrLen):
        if not bucket[arr[i]]:
            bucket[arr[i]] = 0
        bucket[arr[i]] += 1
    for j in range(bucketLen):
        while bucket[j] > 0:
            arr[sortedIndex] = j
            sortedIndex += 1
            bucket[j] -= 1
    return arr
复制代码

5、插入排序

复制代码
# 插入排序
def insertionSort(arr):
    for i in range(len(arr)):
        preIndex = i - 1
        current = arr[i]
        while preIndex >= 0 and arr[preIndex] > current:
            arr[preIndex + 1] = arr[preIndex]
            preIndex = 1
        arr[preIndex + 1] = current
    return arr
复制代码

6、归并排序

复制代码
# 归并排序
def mergeSort(arr):
    import math
    if len(arr) < 2:
        return arr
    middle = math.floor(len(arr) / 2)
    left, right = arr[0:middle], arr[middle:]
    return merge(mergeSort(left), mergeSort(right))


def merge(left, right):
    result = []
    while left and right:
        if left[0] <= right[0]:
            result.append(left.pop(0))
        else:
            result.append(right.pop(0));
    while left:
        result.append(left.pop(0))
    while right:
        result.append(right.pop(0));
    return result
复制代码

7、快速排序

复制代码
# 快速排序
def quickSort(arr, left=None, right=None):
    left = 0 if not isinstance(left, (int, float)) else left
    right = len(arr) - 1 if not isinstance(right, (int, float)) else right
    if left < right:
        partitionIndex = partition(arr, left, right)
        quickSort(arr, left, partitionIndex - 1)
        quickSort(arr, partitionIndex + 1, right)
    return arr


def partition(arr, left, right):
    pivot = left
    index = pivot + 1
    i = index
    while i <= right:
        if arr[i] < arr[pivot]:
            swap(arr, i, index)
            index += 1
        i += 1
    swap(arr, pivot, index - 1)
    return index - 1


def swap(arr, i, j):
    arr[i], arr[j] = arr[j], arr[i]
复制代码

8、选择排序

复制代码
# 选择排序
def selectionSort(arr):
    for i in range(len(arr) - 1):
        # 记录最小数的索引
        minIndex = i
        for j in range(i + 1, len(arr)):
            if arr[j] < arr[minIndex]:
                minIndex = j
        # i 不是最小数时,将 i 和最小数进行交换
        if i != minIndex:
            arr[i], arr[minIndex] = arr[minIndex], arr[i]
    return arr
复制代码

9、希尔排序

复制代码
# 希尔排序
import math

# 希尔排序
def shellSort(arr):
    gap = 1
    while gap < len(arr) / 3:
        gap = gap * 3 + 1
    while gap > 0:
        for i in range(gap, len(arr)):
            temp = arr[i]
            j = i - gap
            while j >= 0 and arr[j] > temp:
                arr[j + gap] = arr[j]
                j -= gap
            arr[j + gap] = temp
        gap = math.floor(gap / 3)
    return arr
复制代码

10、测试

复制代码
from DataStructure.SoftUtil.bubbleSort import bubbleSort, bubbleReverseSort
from DataStructure.SoftUtil.bucket_sort_simplify import bucket_sort_simplify
from DataStructure.SoftUtil.buildMaxHeap import heapSort
from DataStructure.SoftUtil.countingSort import countingSort
from DataStructure.SoftUtil.insertionSort import insertionSort
from DataStructure.SoftUtil.mergeSort import mergeSort
from DataStructure.SoftUtil.quickSort import quickSort
from DataStructure.SoftUtil.selectionSort import selectionSort
from DataStructure.SoftUtil.shellSort import shellSort

if __name__ == '__main__':
    arr = [1, 4, 3, 7, 8, 2, 5]
    print(bubbleSort(arr))
    print(bubbleReverseSort(arr))
    print(selectionSort(arr))
    print(insertionSort(arr))
    print(shellSort(arr))
    print(mergeSort(arr))
    print(quickSort(arr))
    print(heapSort(arr))
    print(countingSort(arr))
    print(bucket_sort_simplify(arr, max(arr)))
复制代码

结果:

复制代码
C:\Anaconda3\envs\FlinkUdf\python.exe C:/app/FlinkUdf/src/main/Python/DataStructure/Imp/SoftIml.py
Traceback (most recent call last):
  File "C:/app/FlinkUdf/src/main/Python/DataStructure/Imp/SoftIml.py", line 21, in <module>
    print(countingSort(arr))
TypeError: countingSort() missing 1 required positional argument: 'maxValue'
[1, 2, 3, 4, 5, 7, 8]
[1, 2, 3, 4, 5, 7, 8]
[1, 2, 3, 4, 5, 7, 8]
[1, 2, 3, 4, 5, 7, 8]
[1, 2, 3, 4, 5, 7, 8]
[1, 2, 3, 4, 5, 7, 8]
[1, 2, 3, 4, 5, 7, 8]
[1, 2, 3, 4, 5, 7, 8]

Process finished with exit code 1
复制代码

 

 posted on   大码王  阅读(195)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具

成都

复制代码

喜欢请打赏

扫描二维码打赏

了解更多

点击右上角即可分享
微信分享提示

目录导航