zoukankan      html  css  js  c++  java
  • 第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;
    	}
    
    
    };
    
    

    题目来源

  • 相关阅读:
    Pandas数据分析 (三)
    Pandas数据分析 (二)
    Pandas数据分析 (一)
    Django后台应用管理名称修改
    Jupyter Notebooks 配置
    Hadoop完全分布式搭建流程
    Java学习笔记(五)
    微信小程序学习笔记(一)
    redis windows版安装
    Linux计划任务
  • 原文地址:https://www.cnblogs.com/ranjiewen/p/9084296.html
Copyright © 2011-2022 走看看