码迷,mamicode.com
首页 > 其他好文 > 详细

tmp

时间:2016-08-20 23:28:51      阅读:344      评论:0      收藏:0      [点我收藏+]

标签:

class ScaleSort {
public:
    vector<int> sortElement(vector<int> A, int n, int k) {
        // write code here
        if(n < 2)
            return A;
        int tmp[k];
        for(int i=0;i<k;i++){
            tmp[i] = A[i];
        }
        //建立一个小根堆
        BuildHeap(tmp,k);
        //调整从第0个到第n-k个数,每次堆顶放在A中的相应位置
        for(int i=0;i<n-k;i++){
            A[i] = tmp[0];
            tmp[0] = A[i+k];
            ChangeHeap(tmp,k,0);
        }
        //调整最后的小根堆中的数
        for(int i=n-k;i<n;i++){
            //堆顶放入有序数组A中
            A[i] = tmp[0];
            if(i == n-1)
                break;
            //调整堆中最后一个数和第一个数            //每次都少一个数,所以k--
            tmp[0] = tmp[--k];
            ChangeHeap(tmp,k,0);
        }
         
        return A;
    }
     
    void swap(int* A,int low, int high){
        int temp = A[low];
        A[low] = A[high];
        A[high] = temp;
    }
        
    void BuildHeap(int* A, int n) {
        int i = n / 2 - 1;
        for (; i >= 0; --i)//从最后一个非叶子节点开始调整
            ChangeHeap(A, n, i);    
    }
       
    void ChangeHeap(int* A, int size, int root) {
        int left = 2 * root + 1;//当前节点的左节点
        int right = 2 * root + 2;//当前节点的右节点
        int largei = root;//先令根节点为最大值的节点
        if (left < size && A[left] < A[largei])
            largei = left;//如果左子树大于根节点
        if (right < size && A[right] < A[largei])
            largei = right;//右子树大于根节点
        if (largei != root) {
            swap(A, root, largei);//交换根节点和左右子树中最大的节点
            ChangeHeap(A, size, largei);//交换完之后,如果破坏了下边的堆结构,需要递归调整
        }        
    }
     
};

 

tmp

标签:

原文地址:http://www.cnblogs.com/zhongzhiqiang/p/5791471.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!