1. 程式人生 > >演算法分析:間接排序

演算法分析:間接排序

排序的過程中,經常要互動資料,尤其是對於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];//更新位置
			}
		}
	}