美文网首页
堆:排序算法与优先队列

堆:排序算法与优先队列

作者: Ell1ot | 来源:发表于2020-04-15 22:07 被阅读0次

    堆是一个数组,它可以被看成一个近似的完全二叉树,树上的每一个结点对应数组中的一个元素。每个子节点一定小于其父节点。使用MaxHeapify函数将当前结点移动到合适位置,BuildMaxHeap函数通过由下(数组长度的二分之一处(向下取整))向上(根节点)调用MaxHeapify函数实现最大堆,最小堆则相反。

    inline int Parent(const int& x) { return x / 2;}
    inline int Left(const int& x) { return x * 2;}
    inline int Right(const int& x) { return x * 2 + 1;}
    inline void Swap(int& a, int& b) { int t = a; a = b; b = t;}
    inline void MaxHeapify(vector<int>& A, const int& i, const int& heapSize) {
        int l = Left(i);
        int r = Right(i);
        int largest = i;
        if(l < heapSize)
            if(A[l] > A[largest])
                largest = l;
        if(r < heapSize)
            if(A[r] > A[largest])
                largest = r;
        if(i != largest) {
            Swap(A[i], A[largest]);
            MaxHeapify(A, largest, heapSize);
        }
    }
    inline void BuildMaxHeap(vector<int>& A, const int& heapSize) {
        for(int i = heapSize / 2 - 1; i >= 0; i--)
            MaxHeapify(A, i, heapSize); 
    }
    

    堆排序

    通过不断将最大堆的根节点(最大值)置于数组的最后位置,并对被交换到根节点的值进行MaxHeapify处理,将使数组变为有序的greater数组。HeapSort函数将调用上面的两个函数,并通过heapSize限制HeapSort函数的执行范围。

    inline void HeapSort(vector<int>& A) {
        int heapSize = A.size();
        BuildMaxHeap(A, heapSize);
        for(int i = A.size() - 1; i >= 1; i--) {
            swap(A[0], A[i]);
            heapSize--;
            MaxHeapify(A, 0, heapSize);
        }
    }
    

    优先队列

    priority_queue用于将一个集合中的元素按照特定顺序排列,c++中可以使用这一容器进行push,pop,top等操作。其中数据类型不可省略,容器类型选择数组类(vector, deque)(不知道使用vector和deque有什么区别,知道的同学请教请教啦o( ̄▽ ̄)ブ),function与sort函数中的一样,可以自定义并且默认greater<>。

    priority_queue<type, container, function> q;
    

    相关文章

      网友评论

          本文标题:堆:排序算法与优先队列

          本文链接:https://www.haomeiwen.com/subject/hwuhvhtx.html