高效排序算法全解析

堆排序的实现

堆排序基于二叉堆数据结构,通常使用数组实现。算法分为两个主要部分:构建堆和排序。

构建最大堆的过程从最后一个非叶子节点开始,向上调整每个子树使其满足堆性质。调整方法是将当前节点与较大子节点交换,递归向下调整。

排序阶段将堆顶元素(最大值)与末尾元素交换,缩小堆范围并重新调整堆。重复此过程直到堆大小为1。

时间复杂度为O(n log n),空间复杂度为O(1)。适用于大规模数据排序,但不稳定。

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

def heap_sort(arr):
    n = len(arr)
    for i in range(n//2 -1, -1, -1):
        heapify(arr, n, i)
    for i in range(n-1, 0, -1):
        arr[i], arr[0] = arr[0], arr[i]
        heapify(arr, i, 0)

计数排序的实现

计数排序是非比较排序算法,适用于整数数据且范围不大的情况。算法统计每个元素的出现次数,然后计算前缀和确定元素位置。

初始化计数数组时,大小为max_val - min_val +1。统计频率后,前缀和数组表示元素在输出数组中的最后位置。反向填充保证稳定性。

时间复杂度为O(n+k),k是数据范围。空间复杂度为O(n+k)。当k远小于n时效率很高。

def counting_sort(arr):
    max_val = max(arr)
    min_val = min(arr)
    range_size = max_val - min_val +1
    
    count = [0] * range_size
    output = [0] * len(arr)
    
    for num in arr:
        count[num - min_val] +=1
    
    for i in range(1, len(count)):
        count[i] += count[i-1]
    
    for num in reversed(arr):
        output[count[num - min_val] -1] = num
        count[num - min_val] -=1
    
    return output

桶排序的实现

桶排序将数据分散到有限数量的桶中,每个桶单独排序后合并。桶的数量和范围需要根据数据分布合理选择。

初始化桶时通常使用数组或链表存储。数据分配到桶后,可采用其他排序算法对每个桶排序。最后按顺序合并所有桶。

时间复杂度取决于桶的数量和内部排序算法,平均为O(n+k)。空间复杂度为O(n)。适用于数据均匀分布的情况。

def bucket_sort(arr, bucket_size=5):
    min_val = min(arr)
    max_val = max(arr)
    
    bucket_count = (max_val - min_val) // bucket_size +1
    buckets = [[] for _ in range(bucket_count)]
    
    for num in arr:
        buckets[(num - min_val) // bucket_size].append(num)
    
    sorted_arr = []
    for bucket in buckets:
        sorted_arr.extend(sorted(bucket))
    
    return sorted_arr

基数排序的实现

基数排序按数字的每位进行排序,从最低位到最高位依次处理。可采用计数排序作为子程序进行稳定排序。

获取最大数字确定排序轮数。每轮根据当前位的数字分配元素,然后收集回原数组。需要处理负数时需特殊处理符号位。

时间复杂度为O(d(n+k)),d是最大数字的位数。空间复杂度为O(n+k)。适用于整数或字符串排序。

def counting_sort_for_radix(arr, exp):
    n = len(arr)
    output = [0] * n
    count = [0] *10
    
    for num in arr:
        index = (num // exp) %10
        count[index] +=1
    
    for i in range(1, 10):
        count[i] += count[i-1]
    
    i = n-1
    while i >=0:
        index = (arr[i] // exp) %10
        output[count[index] -1] = arr[i]
        count[index] -=1
        i -=1
    
    for i in range(n):
        arr[i] = output[i]

def radix_sort(arr):
    max_val = max(arr)
    exp =1
    
    while max_val // exp >0:
        counting_sort_for_radix(arr, exp)
        exp *=10

算法比较与选择

堆排序适合内存受限场景,原地排序但不稳定。计数排序在数据范围小时效率极高。桶排序需要数据均匀分布。基数排序适合位数较少的整数排序。

实际应用中,数据特征决定算法选择。小范围整数优先考虑计数排序,均匀分布数据可用桶排序,通用场景堆排序表现良好,固定位数数据基数排序最优。

BbS.okapop051.sbs/PoSt/1122_821806.HtM
BbS.okapop052.sbs/PoSt/1122_631068.HtM
BbS.okapop053.sbs/PoSt/1122_588669.HtM
BbS.okapop054.sbs/PoSt/1122_110449.HtM
BbS.okapop055.sbs/PoSt/1122_097753.HtM
BbS.okapop056.sbs/PoSt/1122_452556.HtM
BbS.okapop057.sbs/PoSt/1122_905405.HtM
BbS.okapop058.sbs/PoSt/1122_460328.HtM
BbS.okapop059.sbs/PoSt/1122_199595.HtM
BbS.okapop060.sbs/PoSt/1122_140453.HtM
BbS.okapop051.sbs/PoSt/1122_045241.HtM
BbS.okapop052.sbs/PoSt/1122_234097.HtM
BbS.okapop053.sbs/PoSt/1122_382550.HtM
BbS.okapop054.sbs/PoSt/1122_417426.HtM
BbS.okapop055.sbs/PoSt/1122_728416.HtM
BbS.okapop056.sbs/PoSt/1122_179083.HtM
BbS.okapop057.sbs/PoSt/1122_011203.HtM
BbS.okapop058.sbs/PoSt/1122_443811.HtM
BbS.okapop059.sbs/PoSt/1122_844185.HtM
BbS.okapop060.sbs/PoSt/1122_085081.HtM
BbS.okapop051.sbs/PoSt/1122_525566.HtM
BbS.okapop052.sbs/PoSt/1122_169972.HtM
BbS.okapop053.sbs/PoSt/1122_504722.HtM
BbS.okapop054.sbs/PoSt/1122_031562.HtM
BbS.okapop055.sbs/PoSt/1122_794803.HtM
BbS.okapop056.sbs/PoSt/1122_397865.HtM
BbS.okapop057.sbs/PoSt/1122_835198.HtM
BbS.okapop058.sbs/PoSt/1122_435052.HtM
BbS.okapop059.sbs/PoSt/1122_215918.HtM
BbS.okapop060.sbs/PoSt/1122_703593.HtM
BbS.okapop051.sbs/PoSt/1122_944425.HtM
BbS.okapop052.sbs/PoSt/1122_737770.HtM
BbS.okapop053.sbs/PoSt/1122_991852.HtM
BbS.okapop054.sbs/PoSt/1122_910833.HtM
BbS.okapop055.sbs/PoSt/1122_940160.HtM
BbS.okapop056.sbs/PoSt/1122_538680.HtM
BbS.okapop057.sbs/PoSt/1122_434115.HtM
BbS.okapop058.sbs/PoSt/1122_573703.HtM
BbS.okapop059.sbs/PoSt/1122_390964.HtM
BbS.okapop060.sbs/PoSt/1122_189427.HtM
BbS.okapop061.sbs/PoSt/1122_896958.HtM
BbS.okapop062.sbs/PoSt/1122_199989.HtM
BbS.okapop063.sbs/PoSt/1122_307673.HtM
BbS.okapop065.sbs/PoSt/1122_625525.HtM
BbS.okapop066.sbs/PoSt/1122_405875.HtM
BbS.okapop067.sbs/PoSt/1122_399655.HtM
BbS.okapop068.sbs/PoSt/1122_755089.HtM
BbS.okapop069.sbs/PoSt/1122_523726.HtM
BbS.okapop070.sbs/PoSt/1122_044305.HtM
BbS.okapop071.sbs/PoSt/1122_495176.HtM
BbS.okapop061.sbs/PoSt/1122_991766.HtM
BbS.okapop062.sbs/PoSt/1122_932421.HtM
BbS.okapop063.sbs/PoSt/1122_306049.HtM
BbS.okapop065.sbs/PoSt/1122_416388.HtM
BbS.okapop066.sbs/PoSt/1122_391858.HtM
BbS.okapop067.sbs/PoSt/1122_162165.HtM
BbS.okapop068.sbs/PoSt/1122_003962.HtM
BbS.okapop069.sbs/PoSt/1122_204924.HtM
BbS.okapop070.sbs/PoSt/1122_697757.HtM
BbS.okapop071.sbs/PoSt/1122_716140.HtM
BbS.okapop061.sbs/PoSt/1122_391328.HtM
BbS.okapop062.sbs/PoSt/1122_098161.HtM
BbS.okapop063.sbs/PoSt/1122_001907.HtM
BbS.okapop065.sbs/PoSt/1122_893818.HtM
BbS.okapop066.sbs/PoSt/1122_699070.HtM
BbS.okapop067.sbs/PoSt/1122_959979.HtM
BbS.okapop068.sbs/PoSt/1122_977972.HtM
BbS.okapop069.sbs/PoSt/1122_480536.HtM
BbS.okapop070.sbs/PoSt/1122_594545.HtM
BbS.okapop071.sbs/PoSt/1122_922399.HtM
BbS.okapop061.sbs/PoSt/1122_294593.HtM
BbS.okapop062.sbs/PoSt/1122_186279.HtM
BbS.okapop063.sbs/PoSt/1122_801851.HtM
BbS.okapop065.sbs/PoSt/1122_051962.HtM
BbS.okapop066.sbs/PoSt/1122_711980.HtM
BbS.okapop067.sbs/PoSt/1122_491024.HtM
BbS.okapop068.sbs/PoSt/1122_665047.HtM
BbS.okapop069.sbs/PoSt/1122_812426.HtM
BbS.okapop070.sbs/PoSt/1122_714092.HtM
BbS.okapop071.sbs/PoSt/1122_249401.HtM

#牛客AI配图神器#

全部评论

相关推荐

点赞 评论 收藏
分享
karis_aqa:和hr没关系,都是打工的
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务