2_13小范围排序

已知一个几乎有序的数组,几乎有序是指,如果把数组排好顺序的话,每个元素移动的距离可以不超过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;
    }
};
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 该文章总结自牛课网的在线算法课程(https://www.nowcoder.com/) 经典排序算法就是前面讲那几...
    锅与盆阅读 12,300评论 6 14
  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 14,358评论 0 33
  • 第5章 引用类型(返回首页) 本章内容 使用对象 创建并操作数组 理解基本的JavaScript类型 使用基本类型...
    大学一百阅读 8,895评论 0 4
  • 概述 排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部...
    蚁前阅读 10,608评论 0 52
  • 概述:排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部...
    每天刷两次牙阅读 9,109评论 0 15

友情链接更多精彩内容