算法分析:间接排序

排序的过程中,经常要交互数据,尤其是对于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];//更新位置
            }
        }
    }
    原文作者:排序算法
    原文地址: https://blog.csdn.net/u012175089/article/details/54375803
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞