排序算法怎么实现逆序排列?手把手写几个常用例子

你有没有遇到过这样的需求:把一串数字从大到小排,而不是默认的小到大?比如学生成绩要按分数降序展示,商品销量排行榜要从高往低列,或者后台导出的订单时间想按最新在前排列——这时候就得用「逆序排列」。

逆序不是新算法,是调参的事

别被名字吓到。所谓「逆序排列」,本质上还是冒泡、选择、快速、归并这些老熟人,只是比较逻辑翻了个儿。比如原来写 a < b 表示升序交换,改成 a > b 就自然变成降序了。

来点真代码:冒泡逆序版

以 Python 为例,这是最直白的冒泡逆序实现:

def bubble_sort_desc(arr):
n = len(arr)
for i in range(n):
for j in range(0, n - i - 1):
if arr[j] < arr[j + 1]: # 注意这里改成了 <,升序是 >
arr[j], arr[j + 1] = arr[j + 1], arr[j]
return arr

# 测试
nums = [64, 34, 25, 12, 22, 11, 90]
print(bubble_sort_desc(nums)) # 输出:[90, 64, 34, 25, 22, 12, 11]

更省事的办法:用内置函数逆序

实际开发中,很少手写排序。Python 的 sorted()list.sort() 都支持 reverse=True 参数:

data = [5, 2, 8, 1, 9]
desc_sorted = sorted(data, reverse=True) # [9, 8, 5, 2, 1]
data.sort(reverse=True) # 原地修改,data 变成 [9, 8, 5, 2, 1]

Java 里可以用 Comparator.reverseOrder()

List<Integer> list = Arrays.asList(3, 1, 4, 1, 5);
Collections.sort(list, Collections.reverseOrder());

快排逆序:核心就改一行

快速排序逆序的关键,在于分区时把「大于基准」的放左边、「小于基准」的放右边:

def quick_sort_desc(arr):
if len(arr) <= 1:
return arr
pivot = arr[len(arr) // 2]
left = [x for x in arr if x > pivot] # 改这儿:> 表示大的在左
middle = [x for x in arr if x == pivot]
right = [x for x in arr if x < pivot] # 小的在右
return quick_sort_desc(left) + middle + quick_sort_desc(right)

小提醒:字符串也能逆序排

不只是数字。比如一堆文件名 ["a.txt", "z.log", "m.md"],按字母倒序排就是:

files = ["a.txt", "z.log", "m.md"]
files.sort(reverse=True) # ['z.log', 'm.md', 'a.txt']

大小写注意:默认按 ASCII 码排,大写字母(A-Z)码值比小写(a-z)小,所以 ["Z", "a"] 逆序后还是 ["a", "Z"]。真要忽略大小写,得加 key=str.lower