虽然不排序,这两种方法都源于经典的排序算法的扩展
方式一,快速排序的扩展
- /************************************************************************/
- /*找到无序数组中最大的k个数 */
- /************************************************************************/
- #include <iostream>
- #include <stdlib.h>
- #include <time.h>
- using namespace std;
- //找到一个位置,使得左边的数比它大,右边的数比他小
- int Partion(int arr[],int start,int end)
- {
- int i=start,j=end;
- int temp=arr[start];
- while(i<j)
- {
- while( (i<j) &&(arr[j] <= temp) ) j--;
- arr[i]=arr[j];
- while((i<j) && (arr[i]>=temp) ) i++;
- arr[j]=arr[i];
- }
- arr[i]=temp;
- return i;
- }
- void FindK(int arr[],int start,int end,int k)
- {
- if(start<end)
- {
- int p=Partion(arr,start,end);
- if(p>k)
- {
- FindK(arr,start,p-1,k);
- }
- else
- if(p<k)
- {
- FindK(arr,p+1,end,k-p);
- }
- }
- }
- int *Create(int n)
- {
- int *p=new int[n];
- int i=0;
- srand(time(NULL));
- for(;i<n;i++)
- {
- p[i]= rand()%10;
- cout<<p[i]<<" ";
- }
- cout<<endl;
- return p;
- }
- void main()
- {
- int *arr=NULL;
- int k=0,n=0;
- cin>>n;
- arr=Create(n);
- cin>>k;
- FindK(arr,0,n-1,k);
- for(int i=0;i<k;i++)
- cout<<arr[i]<<" ";
- cout<<endl;
- delete arr;
- }
/************************************************************************/
/*找到无序数组中最大的k个数 */
/************************************************************************/
#include <iostream>
#include <stdlib.h>
#include <time.h>
using namespace std;
//找到一个位置,使得左边的数比它大,右边的数比他小
int Partion(int arr[],int start,int end)
{
int i=start,j=end;
int temp=arr[start];
while(i<j)
{
while( (i<j) &&(arr[j] <= temp) ) j--;
arr[i]=arr[j];
while((i<j) && (arr[i]>=temp) ) i++;
arr[j]=arr[i];
}
arr[i]=temp;
return i;
}
void FindK(int arr[],int start,int end,int k)
{
if(start<end)
{
int p=Partion(arr,start,end);
if(p>k)
{
FindK(arr,start,p-1,k);
}
else
if(p<k)
{
FindK(arr,p+1,end,k-p);
}
}
}
int *Create(int n)
{
int *p=new int[n];
int i=0;
srand(time(NULL));
for(;i<n;i++)
{
p[i]= rand()%10;
cout<<p[i]<<" ";
}
cout<<endl;
return p;
}
void main()
{
int *arr=NULL;
int k=0,n=0;
cin>>n;
arr=Create(n);
cin>>k;
FindK(arr,0,n-1,k);
for(int i=0;i<k;i++)
cout<<arr[i]<<" ";
cout<<endl;
delete arr;
}
方式二,堆排序的扩展
- /************************************************************************/
- /*用建堆的方法实现找到最大的K个数 */
- /************************************************************************/
- #include <iostream>
- #include <stdlib.h>
- #include <time.h>
- using namespace std;
- //建立小顶堆
- void HeapAjust(int arr[],int start,int end)
- {
- int temp=arr[start];
- for(int i=start*2;i<=end;i*=2)
- {
- if(i<end && arr[i+1]<arr[i]) i++;
- if(temp<arr[i]) break;
- arr[start]=arr[i];
- start=i;
- }
- arr[start]=temp;
- }
- void Findk(int arr[],int n,int k)
- {
- int i=0;
- int temp;
- //建立k个节点的小顶堆
- for(i=k/2;i>0;i--)
- HeapAjust(arr,i,k);
- for(i=k+1;i<=n;i++)
- {
- if(arr[i]>arr[1])//k中和最小的数比较
- {
- temp=arr[1];
- arr[1]=arr[i];
- arr[i]=temp;
- HeapAjust(arr,1,k);
- }
- }
- }
- int *Create(int n)
- {
- int *p=new int[n+1];
- int i=0;
- srand(time(NULL));
- p[0]=0;
- for(i=1;i<=n;i++)
- {
- p[i]= rand()%10;
- cout<<p[i]<<" ";
- }
- cout<<endl;
- return p;
- }
- void main()
- {
- int *arr=NULL;
- int k=0,n=0;
- cin>>n;
- arr=Create(n);
- cin>>k;
- Findk(arr,n-1,k);
- for(int i=1;i<=k;i++)
- cout<<arr[i]<<" ";
- cout<<endl;
- delete arr;
- }