美文网首页
2_13小范围排序

2_13小范围排序

作者: X_Y | 来源:发表于2017-09-06 16:59 被阅读6次

已知一个几乎有序的数组,几乎有序是指,如果把数组排好顺序的话,每个元素移动的距离可以不超过k,并且k相对于数组来说比较小。请选择一个合适的排序算法针对这个数据进行排序。

给定一个int数组A,同时给定A的大小n和题意中的k,请返回排序后的数组。

测试样例:
输入:[2,1,4,3,6,5,8,7,10,9],10,2
返回:[1,2,3,4,5,6,7,8,9,10]

class ScaleSort {
public:
    void swap(vector<int> &A, int i, int j)
    {
        int tmp = A[i];
        A[i] = A[j];
        A[j] = tmp;
    }

    // 调整堆,adjusting_node,是当前待调整的节点
    void adjust_heap(vector<int> &A, int adjusting_node, int last_node)
    {
       int parent =  adjusting_node, child = 2 * adjusting_node + 1;
       int curr_value = A[adjusting_node];
       while(child <= last_node){
           if(child < last_node && A[child] > A[child+1]){
               ++child;
           }
           if(curr_value > A[child]){
               A[parent] = A[child];
               parent = child;
               child = 2*parent + 1;
           }
           else{
               break;
           }
       }
       A[parent] = curr_value;
    }

    vector<int> sortElement(vector<int> A, int n, int k) {
        // write code here
        if (n < k){
            return A;
        }
        // 初始化大小为K的最小堆,由A的前K个元素组成
        vector<int> heap(A.begin(), A.begin()+k);
        for(int i=k/2-1; i>=0; i--){
            adjust_heap(heap, i, k-1);
        }
        // 对钱n-k个数进i行排序
        int idx = k;
        while(idx<=n-1){
            A[idx - k] = heap[0];
            heap[0] = A[idx];
            adjust_heap(heap, 0, k-1);
            ++idx;
        }
        // 对剩下的n-k个数进行排序
        for(int i=k-1; i>=0; i--){
            A[idx - k] = heap[0];
            ++idx;
            heap[0] = heap.back();
            heap.pop_back();
            adjust_heap(heap, 0, heap.size()-1);
        }
        return A;
    }
};

相关文章

  • 2_13小范围排序

    已知一个几乎有序的数组,几乎有序是指,如果把数组排好顺序的话,每个元素移动的距离可以不超过k,并且k相对于数组来说...

  • 小范围排序练习题

    题目 已知一个几乎有序的数组,几乎有序是指,如果把数组排好顺序的话,每个元素移动的距离可以不超过k,并且k相对于数...

  • 小范围解封

    12日下午,我们门前这条沉寂了许久的马路,突然热闹了起来,往日我们都在路上自由自在地打羽毛球,这会儿汽车、摩托车、...

  • 最小范围

    https://www.lintcode.com/problem/smallest-range/descripti...

  • 小范围快乐

    生活的种种小细节引发了一点想法,快乐是一个小范围的事。发生在特定空间,特定时间的,一旦超出了这个范畴。快乐不复存在...

  • 小范围改制重组

    我也不知道,最终会被命运推到哪里去。守好自己的心,这是我现阶段认识到的最重要的事。 不算是有大格局的人,也担不起太...

  • 小范围盘点

    应该说最近活动小范围内很丰富,想写的很多,但我肯定写不全,想到哪写到哪。 在养小乌龟这件事上,我还是比较自豪的,就...

  • 小范围自由啦

    就在刚才,我抱着芃哥,正在哄睡。“小情人”在我怀里,蜷缩成一团,昏昏欲睡的样子,可爱极了。 “解封啦...

  • 第六次作业

    被动引流小范围测试

  • 小范围试错,快速迭代

    之所以写这个话题,还是从自己的拖延症开始…… 拖延症,我想大家一定都不会陌生,几乎每个人都有过,只不过程度不同罢了...

网友评论

      本文标题:2_13小范围排序

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