内排序

内排序

几种基本排序见博客

https://blog.csdn.net/huyidai/article/details/104479105

补充

1.基数排序

基数排序是一种借助多关键字排序的思想对单逻辑关键字进行排序的方法。那么什么是多关键字排序?

例如,对扑克牌进行排序,每张扑克牌有两个“关键字”:花色(梅花♣<方块♦<红桃♥<黑桃♠)和面值(2<3<,…,A),且“花色”的地位高于”面值”, 那么对扑克牌排序有两种方法:

  方法1:先按不同“花色”分成有次序的4堆,每一堆的”花色”相同; 然后分别对每一堆内部按”面值”大小整理有序。这种先对主键字字进行排序,再对次关键字排序的方法叫最高位优先法(简称MSD: Most Significant first)

  方法2:先按不同”面值”分成13堆,然后将13堆自小到大叠在一起(“3”在”2”之上,”4”在”3”之上,…,最上面的是4张”A”),然后将这幅牌整个颠倒过来再重新按不同花色分成4堆,最后将这4堆按自小到的次序合在一起(梅花在最下面,黑桃在最上面)。这种先对次键字字进行排序,再对主关键字排序的方法叫最低位优先法(简称LSD: Least Significant first)

链式基数排序:

采用多关键字排序中的LSD方法,先对低优先级关键字排序,再按照高点的优先级关键字排序,不过基数排序在排序过程中不需要经过关键字的比较,而是借助“分配”和“收集”两种操作对单逻辑关键字进行排序的一种内部排序方法。

例如,若关键字是十进制表示的数字,且范围在[0,999]内,则可以把每一个十进制数字看成由三个关键字组成(K0, K1, K2),其中K0是百位数,K1是十位数,K2是个位数。基RADIX的取值为10; 按LSD进行排序,从最低位关键字起,按关键字的不同值将序列中记录“分配”到RADIX个队列中后再“收集”之,如此重复d次。按这种方法实现的排序称之为基数排序,以链表作存储结构的基数排序叫链式基数排序。

链式基数排序算法代价分析:

(1)空间代价

n个记录空间;

r个子序列的头尾指针;

O(n,r)

(2)时间代价

不需要移动记录本身,只需要修改记录的next指针;

O(d·(n+r))

基数排序效率

时间代价为O(d·n),但实际上还是O(nlogn)

没有重复关键码的情况,需要n个不同的编码来表示他们,也就是说,d>=logr为底n的对数,即在Ω(logn)中。

2.索引排序

在排序时,若是数据非常复杂。对数据的移动是十分费时的。若把数据移动改为索引(或指针)移动。则降低了操作复杂度。索引排序。也叫地址排序,就是这样的排序思想。

基本思想:

索引数组s[i]存放的是a[i]数组的原先应该在的数组位置( a[i]=a[s[i]]),然后a[s[0]],a[s[1]],……,a[s[n-1]]有序。
例如:
从0---n-1开始遍历,如果索引值和当前位置不符合,就顺着索引链进行循环调整,直到找到等于当前下标值的索引位置为止。
每一轮循环所涉及的记录都调整到位,其索引下标都改为所在位置的小比,即满足“索引值等于下标值”,因此不会参与其他的循环调整。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值