博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
输出前m大的数
阅读量:4216 次
发布时间:2019-05-26

本文共 1543 字,大约阅读时间需要 5 分钟。

O(n+mlogm)
n为快排中线性扫描时间,mlogm为对m各最大数进行归并排序耗时
#include
using namespace std;int a[100];void swap(int &a, int &b) { int t = a; a = b; b = t; }void merge(int a[],int s,int m, int e, int tmp[])//归并 把每一小部分归为有序 { int pt = 0; int p1 = s,p2 = m+1; while(p1 <= m && p2 <= e){ if(a[p1] < a[p2]){ tmp[pt++] = a[p1++]; } else{ tmp[pt++] = a[p2++]; } } while(p1 <= m)//把剩余可能部分的加入归并结果 tmp[pt++] = a[p1++]; while(p2 <= e) tmp[pt++] = a[p2++]; for(int i = 0; i < e-s+1; ++i){//把此部分归并(排序)结果重新赋值到a中 a[s+i] = tmp[i]; } }void mergeSort(int a[],int s, int e,int tmp[]) { if(s < e){ int m = s + (e-s)/2;//记录中点 mergeSort(a,s,m,tmp); mergeSort(a,m+1,e,tmp); merge(a,s,m,e,tmp); } } void arrangeRight(int *a, int s, int e, int k)//利用线性时间找出前k大的数放在右边{ if(s >= e) return; if(k == e-s+1) return; int i = s; int j = e; int key = a[s]; while(i != j) { while(i < j && a[j] >= key) --j; swap(a[i],a[j]); while(i < j && a[i] <= key) ++i; swap(a[i],a[j]); } //如果右边的数刚好为e-i+1为k个 if(k == e - i + 1) return; //右边的数大于k个 else if(k < e - i + 1) { arrangeRight(a,i+1,e,k); } //右边的数小于k个,需要左边取出k - (e-i+1)个 else { arrangeRight(a,s,i-1,k-e+i-1); }}int main() { int a[] = {4,3,1,6,9,11,5,8,10,2}; int tmp[11]; int n = sizeof(a)/sizeof(int); int m; scanf("%d",&m); arrangeRight(a,0,n-1,m); mergeSort(a,n-m,n-1,tmp); for(int i = 0; i < n; ++i){ printf("%4d",a[i]); } return 0; }

转载地址:http://nqimi.baihongyu.com/

你可能感兴趣的文章
lua math.fmod使用注意小数问题
查看>>
lua 时间转化
查看>>
lua学习笔记之五(Lua中的数学库)
查看>>
dos: tree命令生成目录结构
查看>>
Managing Projects from the Command Line(android官网文档)
查看>>
Android项目自动生成build.xml,用Ant打包
查看>>
CCLayer注册lua回调函数setTouchPriority失效
查看>>
cocos2dx左下角三行数值意义
查看>>
LUA modue require package 区别
查看>>
package.loaded
查看>>
cocoStudio: Button设置锚点问题
查看>>
vld 使用
查看>>
MAC下安装多版本JDK和切换几种方式
查看>>
java.util.concurrent详解
查看>>
java事务大总结(一) 先理解数据库的事务以mysql为例
查看>>
java事务大总结(二) 理解JDBC事务的工作机制
查看>>
java事务大总结(三) 理解学习 JTA(Java Transaction API)
查看>>
java事务大总结(四)spring事务相关大总结
查看>>
驴妈妈管理的一点经验总结
查看>>
IOS开发学习的好资料大搜藏
查看>>