微软等数据结构+算法面试100题(46)-- 查找最小的k 个元素

来源:互联网 发布:vb自动登录弹出窗口 编辑:程序博客网 时间:2024/06/11 19:56
查找最小的k 个元素
题目:输入n 个整数,输出其中最小的k 个。

例如输入1,2,3,4,5,6,7 和8 这8 个数字,则最小的4 个数字为1,2,3 和4。


这是比较有名的top k问题。求在一堆数中,这堆数要大于k。假设有n个。求出前最小的n的元素


1.全排。将所有元素排序,找出前n个。复杂度n*logn。
2.插入排序。需要k趟。复杂度是nk。
3.堆排序。建一个大小为k的最小二叉堆。建堆复杂度是k。剩下元素个数为n-k要进入堆中。需要和堆顶元素比较。下溯(n-k)*logk。所以总的复杂度是n*logk。
4.改进的快排。快排主要是选择轴点。左侧的元素都要比轴点小,右侧的都要比轴点大。[low,pivot-1] pivot [pivot+1,high]
那么如果[low,pivot-1]的元素个数pivot-low=n。这样前n个最小的已经出来了
如果[low,pivot-1]的元素个数pivot-low>n。那么前n个最小的一定在区间[low,pivot-1]。区间缩小了。
如果[low,pivot-1]的元素个数pivot-low<n。那么前n个最小的已经有pivot-low个被找出来了。还剩下n-(pivot-low)在区间[pivot,high]中。


int TopN(int *p,int low,int high,int n){if(high-low+1<=n)return high;int pivot=Parition(p,low,high);if(pivot-low==n)return pivot-1;else if(pivot-low>n)return TopN(p,low,pivot-1,n);elsereturn TopN(p,pivot+1,high,n-(pivot-low+1));}void TopNTest(){int p[]={1,2,15,-10,0,7,-1,25,29,8,6,16,5};int len=sizeof(p)/sizeof(int);cout<<"array : ";ShowArray(p,len);int n=0;cout<<"input n : ";cin>>n;int end=TopN(p,0,len-1,n);cout<<"array : ";ShowArray(p,len);}

6

原创粉丝点击