赞
踩
N个无序的数(可能数目非常大),选出其中最大的K个数。
方法一:对所有元素进行排序,之后取出前K个元素,不提倡使用
思路:使用最快排序算法,选择快排 或 堆排
时间复杂度:O(n*logn) + O(K) = O(n*logn)
特点:需要对全部元素进行排序,K = 1 时,时间复杂度也为O(n*logn)
方法二:只需要对前K个元素排序,不需要对N-K个元素进行排序,不提倡使用
思路:使用 选择排序 或 起泡排序,进行K次选择,可得到第k大的数
时间复杂度:O(n*k)
//这个二分跟以前的二分不一样在于mid,这个的意思是以第一个为标准进行划分,最后确定于k的关系- #include<iostream>
- #include<bits/stdc++.h>
- const int N=100000+10;
- using namespace std;
-
- int a[N];
- int b[N];
- void binary_search(int left,int right)
- {
- int i=left;
- int j=right;
- while(i!=j)
- {
- if(i<j)
- {
- if(a[i]>a[j])
- {
- swap(a[i],a[j]);
- swap(i,j);
- }
- else
- j--;
- }
- else
- {
- if(a[i]<a[j])
- {
- swap(a[i],a[j]);
- swap(i,j);
- }
- else
- j++;
- }
- }
- if(i>k)
- {
- binary_search(left,i-1);
- }
- else if(i<k)
- {
- binary_search(i+1,right);
- }
- else
- {
- for(int p=1; p<=n; p++)
- {
- if(b[p]==a[k])
- {
- printf("%d\n",p);
- break;
- }
- }
- }
- }
- int main()
- {
- int n,k;
- while(cin>>n>>k)
- {
- for(int i=1; i<=n; i++)
- {
- scanf("%d",&a[i]);
- b[i]=a[i];
- }
- binary_search(1,n);
- }
- return 0;
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。