快速排序查找 N个整数中,找到前M(M<<N)个最大的数字
2015-03-20 15:43
447 查看
/**< N个整数中,找到前M(M<<N)个最大的数字 */ #include <iostream> #include <cstdio> #include <ctime> using namespace std; #define N 100 int arr ; void initArr(int *arr,int n); void findMmax(int *arr,int n,int m); void Print(int *arr,int i,int j); int Partition(int *arr,int i,int j,int tar); int main() { int n,m; while(scanf("%d%d",&n,&m)==2) { if(n<m) { puts(" n >= m"); continue; } initArr(arr,n); Print(arr,0,n-1); findMmax(arr, n, m); Print(arr,n-m,n-1); } return 0; } void initArr(int *arr,int n) { srand(time(NULL)); int i=0; for(;i<n;++i) { arr[i]=rand()%N+i; } } void Print(int *arr,int i,int j) { for(;i<=j;++i) { printf("%d ",arr[i]); } puts(""); } int Partition(int *arr,int i,int j,int tar) { int pivort = arr[i]; while(i<j) { while(i<j && arr[j]>=pivort) --j; arr[i] = arr[j]; while(i<j && arr[i]<=pivort) ++i; arr[j] = arr[i]; } arr[i] = pivort; return i; } void findMmax(int *arr,int n,int m) { int pt = Partition(arr,0,n-1,n-m); int tar = n-m; while(pt!=tar) { if(pt>tar) pt = Partition(arr,0,pt-1,tar); else if(pt<tar) pt = Partition(arr,pt+1,n-1,tar); } }
相关文章推荐
- 分治算法的利用例子(查找最大最小数,快速排序,查看第k小的数字)
- List<T>采用delegate快速实现排序、查找等操作
- List<T>采用delegate快速实现排序、查找等操作
- List<T>采用delegate快速实现排序、查找等操作
- List<T>采用delegate快速实现排序、查找等操作
- List<Map<String,String>>快速排序、
- 数组 获取最值(最大值 最小值)选择排序 冒泡排序 快速排序 半查找(二分查找) 十进制转其他进制法
- 给一个整数数组,对数组中的每个整数中的所有数字按照升序排列(如101排序后为011)请写一个方法,输出排序后的数组中的最大数。 例如有一个数组: 101、132、375,排序后11、123、357,
- 蓝桥杯--查找整数&&数列排序
- 在平面N*N(N<=500)的格子上有一些障碍物。要求找到一个最大的正方形,它的内部不包含障碍物
- 快速查找素数 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描述 现在给你一个正整数N,要你快速的找出在2.....N这些数里面所有的素数。 输入 给出一个正整数数N(N<=
- C#中的delegate以及利用List<T>中delegate快速实现排序、查找
- 有 n 个无序整数( n>10000), 则找出其中最大的 M 个数字( 5<M<10), 所需要的最小时间复杂度为:
- 面试题:求整数a,b的最大值,不许使用if,switch,<,>,?,:
- Uva1225 求数字0-9在前n个正整数中出现的次数(1<=n<=10000)
- List<T>采用delegate快速实现排序、查找等操作
- 笔试算法题(30):从已排序数组中确定数字出现的次数 & 最大公共子串和最大公共序列(LCS)
- n个无序整数,已知第i个数在排好序的序列中的位置为j,满足|i-j|<=K,请设计一种排序算法,对该序列进行排序。注:算法时间复杂度为O(nlgn)的得0分,复杂度为O(nk) 的得两分,总分是20分
- 数据结构--查找&&排序(快速复习)