[Alg]排序算法之分布排序

分布排序,又称桶排序或基数排序,是一种非比较型整数排序算法。文章详细介绍了如何通过基数排序算法对扑克牌进行排序,并探讨了基数排序与基数交换排序的区别。文中提供了一种基于链表的基数排序算法(算法H),并解释了其工作原理。此外,还讨论了在计算机补码表示下基数排序的特殊考虑。
摘要由CSDN通过智能技术生成

[Alg]排序算法之分布排序

作者:屎壳郎

日期:Aug 2021

版次:初版


简介: 分布排序是与归并排序截然相反的处理思路,归并排序是逐步融合归并,而分布排序是分组然后合并,再分组再合并,所以分布排序又称为“桶排序”、“基数排序”或“数排 序”。它基于键值数字特性字分类,从而避免了比较操作。

1、引言

假设要对52张扑克牌排序,定义牌面键值顺序:
A < 2 < 3 < 4 < 5 < 6 < 7 < 8 < 9 < 10 < J < Q < K A<2<3<4<5<6<7<8<9<10<J<Q<K A<2<3<4<5<6<7<8<9<10<J<Q<K
定义花色键值顺序:
♣ < ♢ < ♡ < ♠ \clubsuit<\diamondsuit<\heartsuit<\spadesuit <<<
两张牌确定先后顺序的条件为(i)它的花色小于另一张,或者(ii)两个花色相同,但牌面值小于另一张。通常的排序方法类似于基数交换排序(见《[Alg]排序算法之交换排序》,先根据花色分成四堆,然后再根据牌面值调整每一堆中牌的顺序。

还有一种更快的方法处理这类排序!首先根据牌面值分成13堆,先对这13堆排好序,即 A < 2 < ⋯ < K A<2<\cdots<K A<2<<K;然后再根据花色分为4堆。然后合并到一起就得到排好序的结果。这个方法乍一看不显然。在第二步按花色分类时,如果两张牌进入不同的堆,说明花色不一样,会根据花色排序;如果两张牌具有一样的花色,那在第一步分类时已经排好序。同样的思想也可以应用到数字或字母类型的任意字典序的排序上。

N N N个记录,分成 M M M堆,每个堆的容量要保证能容纳 N N N个记录,这就需要 M ( N + 1 ) M(N+1) M(N+1)的空间,这就是大部分人拒绝这个算法的原因。

2、基数排序

下面介绍一种基于键值的基数,采用链表法的排序算法,姑且称之为基数排序。下面举一个以10进制为基数排序的例子。
503    087    512    061    908    170    897    275    653    426    154    509    612    677    765    703 503\;087\;512\;061\;908\;170\;897\;275\;653\;426\;154\;509\;612\;677\;765\;703 503087512061908170897275653426154509612677765703

第一趟遍历,以个位数为基准分堆,结果如下:
在这里插入图片描述

完成后重新串连起来,见图中红色线(算法H):
在这里插入图片描述

第二趟遍历,以十位数为基准分堆,结果如下:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值