算法分析:间接排序

排序的过程中,经常要交互数据,尤其是对于C++这种语言,交互两个比较大的对象,是很耗时间的。

如果只是交互两个对象的指针,就会快很多了。

间接排序的关键是排序后,怎样才能按指针的顺序,摆好数组的位置。

其中核心的排序算法,是使用了快速排序

	//------------间接排序---------
	template<typename Comparable>
	class Pointer//构建一个可以比较的指针
	{
	public:
		Pointer(Comparable* rhs = NULL) :pointee(rhs){}
		bool operator<(const Pointer& rhs)const
		{
			return *pointee < *rhs.pointee;
		}
		operator Comparable*()const
		{
			return pointee;
		}
	private:
		Comparable* pointee;
	};
	//间接排序
	template<typename Comparable>
	void largeObjectSort(Vector<Comparable>& a)
	{
		//构建一个指针数组
		Vector<Pointer<Comparable>> p(a.size());
		int i = 0;
		int j = 0;
		int nextj = 0;
		//将原来的数组的地址放到指针数组里面
		for (i = 0; i < a.size(); i++)
		{
			p[i] = &a[i];
		}
		//对指针进行排序
		quicksort(p);
		//将数组的元素按照指针的顺序摆放,
		for (i = 0; i < a.size(); i++)
		{
			if (p[i] != & a[i])//地址不相同
			{
				Comparable tmp = a[i];//把值放到临时的地方
				//地址比较,在p中寻找一个指向a[i]地址的地方
				for (j = i; p[j] != &a[i]; j = nextj)
				{
					nextj = p[j] - &a[0];//p[j]指向值将会被移动,所以这个位置的内容没有用了,将是下一个操作的位置
					a[j] = *p[j];//更新第j个位置的数据,a[j]是上一次循环的时候指向的地方,值已经没用了。
					p[j] = &a[j];//更新第j个数据的位置,这个时候p[j]和a[j]对应了
				}
				a[j] = tmp;//找到了真正指向a[i]的位置,a[j]是新的排位
				p[j] = &a[j];//更新位置
			}
		}
	}


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值