浅谈基数排序

浅谈基数排序

前言

注意,本贴的算法是基数排序而不是计数排序。这两者差别不大,但是存在着一定差异。

一句话做法

从低位到高位,每次都把所有要排序的数(含前导 0 0 0)丢入相应的桶( 0 0 0~ 9 9 9),再从小到大(对于桶的编号而言从小到大)取出来,一定次数后,原数组有序。

数据模拟

假如要对以下几个数排序。

103 7 65 234 932 45

第一轮,看个位

此刻数组为:

932 103 234 45 65 7

第二轮,看十位

此刻数组为:

7 103 932 234 45 65

第三轮,看百位

此刻数组为:

7 45 65 103 234 932

此时尽管数组已经有序,但过程并未完整。因为对于一些数据是不一定如此凑巧提前就能排好序的。

第四轮,看千位

此刻数组为:

7 45 65 103 234 932

数组已经有序。

证明

注:以下考虑正整数。“数字”是 [ 0 , 9 ] [0,9] [0,9] 之间的,“数”是 [ 0 , + ∞ ) [0,+\infty) [0,+)

在小学一年级的时候,我们就已学过如何比较数之间的大小。

首先看数的位数,位数大的,肯定较大。

其次从高到低比较每位上的数字大小,一直到不等的时候,哪个数字大,那个数就大。

因此,基数排序的原理也是一样的。

首先从最低位开始放,就可以确定当前位的数字的相对大小关系。

然后考虑再高一位的时候(不妨称为“升位”),那些位数不够的数就会全部放入 0 0 0 的桶里。

由于我们是按从小到大的顺序将不同的桶的元素放入 0 0 0 号桶,所以保证了“桶底”的一定是最小的。

TreeSet是一个有序的集合,它根据元素的自然排序进行排序。如果在创建TreeSet时没有指定Comparator,那么将使用元素的自然排序。元素的自然排序是通过实现Comparable接口来定义的。 如果元素没有实现Comparable接口,则在创建TreeSet时必须提供Comparator来定义排序顺序。Comparator可以在创建TreeSet时通过构造函数参数传递。 TreeSet使用红黑树来实现排序。红黑树是一种自平衡二叉搜索树,它保证了插入,删除,查找操作的时间复杂度为O(log n)。在红黑树中,每个节点都有一个颜色属性,它可以是红色或黑色。红黑树满足以下规则: 1. 每个节点都是红色或黑色。 2. 根节点是黑色。 3. 每个叶子节点(NIL节点,空节点)是黑色的。 4. 如果一个节点是红色的,则它的两个子节点都是黑色的。 5. 对于每个节点,从该节点到其所有后代叶子节点的简单路径上,均包含相同数目的黑色节点。 通过这些规则,红黑树可以保证在插入,删除,查找操作时,树的高度不会超过log2(n),因此它的时间复杂度为O(log n)。 当我们向TreeSet中添加元素时,它会按照元素的自然排序或者通过Comparator定义的排序规则,找到合适的位置插入新元素。在插入完成后,TreeSet会自动进行平衡操作,以保持红黑树的平衡性。当我们从TreeSet中删除元素时,它也会自动进行平衡操作。 总结起来,TreeSet的排序原理是通过红黑树实现的,它使用元素的自然排序或者通过Comparator定义的排序规则进行排序。在插入和删除元素时,TreeSet会自动进行平衡操作,以保持红黑树的平衡性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值