第2章 排序 || 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:
    vector<int> sortElement_1(vector<int> A, int n, int k) {
        // write code here
        sort(A.begin(), A.end());
        return A;
    }

    void headAdjust(vector<int> &src,int root,int size) //调整为小顶堆;必须加引用,传地址
    {
        int temp = src[root];
        for (int child = 2 * root + 1; child < size;child=2*child+1)
        {
            if (child+1<size&&src[child]>src[child+1]) //右孩子小
            {
                child++;
            }
            if (temp<src[child])
            {
                break;
            }
            src[root] = src[child];
            root = child;
        }
        src[root] = temp;
        return;
    }

    vector<int> sortElement(vector<int> A, int n, int k) {
        // write code here
        if (n==0||n<k)
        {
            return A;
        }
        vector<int> B; //含有k个元素
        for (int i = 0; i < k;i++)
        {
            B.push_back(A[i]);
        }
        //创建小顶堆,即调整堆得过程
        for (int i = k / 2-1; i >= 0;i--)
        {
            headAdjust(B,i,k);
        }
        for (int i = k; i < n;i++)
        {
            A[i - k] = B[0]; //交换堆顶元素
            B[0] = A[i];
            headAdjust(B, 0, k);
        }
        //最后k个元素堆排序
        for (int i = n - k; i < n; i++)
        {
            A[i] = B[0];
            swap(B[k-1],B[0]);
            headAdjust(B, 0, --k);
        }
        return A;
    }


};

题目来源

    原文作者:ranjiewen
    原文地址: https://www.cnblogs.com/ranjiewen/p/9084296.html
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞