表排序

什么情况下会用到表排序呢?
就是待排的元素不是简简单单的整数,比如说一个十分复杂的结构体,例如一本书的内容,但需要移动一个元素的时候,移动元素的时间是不能够忽略不计的。于是如果简单调用快速排序或者其他排序算法,他们都是需要频繁的交换或者移动元素。如果这个元素是书或者课本的时候,元素移动的时间就是一个很恐怖的事情 。

表排序是这样的一个算法,在实际的过程中是不需要移动元素的,需要移动的只是指向这些元素的指针
不需要移动元素本身,只移动指针的方法叫做间接排序。
只需要定义一个指针数组作为表
看一个栗子:
待排序列A[],每一个元素都有一个关键字,按照关键字排序,但是A[]元素本身是一个很庞大的结构体,不能随意的移动。
在这里插入图片描述
首先定义一个table[](指针数组,记录的是A[]元素的下标):
初始的时候table[i] = i,也就是说tabled的第i个指针table[i]指向A[]中的第i个元素。
在这里插入图片描述
于是调用任何一种排序算法,看看是怎么执行的?
就用插入排序演示:
在这里插入图片描述
不需要动任何一本书,就完成了排序的过程。

  • 假如在表排序完成之后,如果非得需要进行物理上的排序,如何处理?
    有一种非常聪明的做法可以在线性的时间复杂度之内完成。
  • 一个重要的原理:
    N个数字的排列由若干个独立的环组成。
    在这里插入图片描述
    table[0] = 3;
    table[3] = 1;
    table[1] = 5;
    tanle[5] = 0;

    发现0,3,1,5组成了一个环

table[2] = 2;
单独的数字2组成一个环

table[4] = 7;
table[7] =6;
table[6] = 4;
4,7,6组成环

这些不同的环数字是独立的在这里插入图片描述


意味着在调整的时候可以一个环一个环的调整位置
具体来说:
拿下第一本书存放到Temp中,然后将
A[0]存放A[3],
A[1]存放A[5],
A[3]存放A[1];
A[5]存放Temp; 线性的时间
在这里插入图片描述
如何判断一个环的结束?
从table[2] = 2;中得到启发
在这里插入图片描述

  • 复杂度的分析:
    在这里插入图片描述
  • 算法实现
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值