zoukankan      html  css  js  c++  java
  • [置顶] 从一位数组中提取最小k个元素

    #include <iostream>
    #include <cstdlib>
    #include <vector>
    
    using namespace std;
    /*
     * 从n个整型数组中提取前k个最小整数
     * 方法一:利用快速排序进行递归划分
    */
    const int Max = 100;   // 数组最大容量
    class Solution {
    private:
    	vector<int>array;  // 输入的数组 
    	vector<int>kmin;   // 提取的k个最小值的数组
        /*   
    	 * 对数组进行划分,返回“中值”位置
    	*/
    	int Adjust(vector<int>&arr, int low, int high) {
    		int i, j;
    		i = low;
    		j = high;
    		int tmp = arr[low];
    		while(i < j) {
    			while(i < j && arr[j] > tmp) j--;
    			if(i < j) arr[i++] = arr[j];
    
    			while(i < j && arr[i] < tmp) i++;
    			if(i < j) arr[j--] = arr[i];
    
    		}
    		arr[i] = tmp;
    		return i;
    	}
        /*
    	 * 利用上面的调整函数进行查找
    	*/
    	void JustDoIt(vector<int>&arr, int low, int high, int k) {
    		int i;
    		int mid = Adjust(arr, low, high);
    		static bool find;     // 用于递归截断
    		/*
    		 * 找到解
    		*/
    		if(!find && (mid + 1 == k || mid == k)) {
    			find = true;
    			for(i = 0;i < k;i++) {
    				kmin.push_back(arr[i]);
    			}
    			return;
    		}
    		/*
    		 * 递归处理 
    		*/
    		else if(!find && k > mid + 1) {
    			JustDoIt(arr, mid + 1, high, k);
    		}
    		else if(!find) {
    			JustDoIt(arr, low, mid - 1, k);
    		}
    	}
    
    public:
    	Solution(int n) {
    		if(n < 0 || n>= Max) {
    			cerr<<"参数不合法!"<<endl;
    			exit(1);
    		}
    		int i;
    		int e;
    		for(i = 0;i < n;i++) {
    			cout<<"请输入第"<<i<<"个整数:";
    			cin>>e;
    			if(!cin.good()) exit(1);
    			array.push_back(e);
    		}
    	}
    	void JustDoIt(int k) {
    		if(k <= 0 || k > array.size()) {
    			cerr<<"参数不合法!"<<endl;
    			exit(1);
    		}
    		JustDoIt(array, 0, array.size() - 1, k);
    	}
    	void show()  {
    		vector<int>::iterator it;
    		for(it = kmin.begin(); it != kmin.end(); it++) {
    			cout<<*it<<endl;
    		}
    	}
    };
    
    void main() {
    	Solution s(10);
    	s.JustDoIt(3);
    	s.show();
    }



  • 相关阅读:
    西交应用统计学(四)
    SPSS非参数检验
    并查集实现
    二叉树遍历非递归算法
    算法导论——渐近符号、递归及解法
    SPSS均值过程和T检验
    二维数组的查找及向函数传递二维数组问题
    printf()的格式
    C++ string类型的读写
    替换字符串中的空格
  • 原文地址:https://www.cnblogs.com/bbsno1/p/3279702.html
Copyright © 2011-2022 走看看