高效排序算法全解析
堆排序的实现
堆排序基于二叉堆数据结构,通常使用数组实现。算法分为两个主要部分:构建堆和排序。
构建最大堆的过程从最后一个非叶子节点开始,向上调整每个子树使其满足堆性质。调整方法是将当前节点与较大子节点交换,递归向下调整。
排序阶段将堆顶元素(最大值)与末尾元素交换,缩小堆范围并重新调整堆。重复此过程直到堆大小为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