题目描述
要求在N个不重复的整数中,找出第K大的整数 ,其中0<K<N<1000000
输入
输入第一行为两个正整数N K
第二行为N个整数,输入保证这N个整数两两相异,每个整数的范围在-1000000到1000000之间
输出
输出第K大的整数值#include<string.h>
#include<stdio.h>
#include <malloc.h>
#define N 100
int m;
int n;
void swap(int *a,int *b){
int temp;
temp=*a;
*a=*b;
*b=temp;
}
int Partition(int *arr,int low,int high){
int pivotkey;
int k=low+(high-low)/2;
if(arr[low]>arr[high])
swap(&arr[low],&arr[high]);
if(arr[k]>arr[high])
swap(&arr[k],&arr[high]);
if(arr[low]>arr[k])
swap(&arr[low],&arr[k]);
pivotkey=arr[low];
arr[0]=pivotkey;
while(low<high){
while(low<high && arr[high]>=pivotkey)
high--;
arr[low]=arr[high];
while(low<high && arr[low]<=pivotkey)
low++;
arr[high]=arr[low];
}
arr[low]=arr[0];
return low;
}
void QSort(int *arr,int low, int high){
//printf("%d %d \n",low,high);
int pivot;
int k=n-m+1;
if(low<high){
pivot=Partition(arr,low,high);
if(k<pivot)
QSort(arr,low,pivot-1);
if(pivot<k)
QSort(arr,pivot+1,high);
if(k==pivot){
// printf("%d\n",arr[pivot]);
return ;
}
}
// return ;
}
int arr[1000000];
int main(){
while(scanf("%d %d",&n,&m)!=EOF){
//scanf("%d %d",&n,&m);
// int *arr=(int *)malloc((n+1)*sizeof(int));
// if(NULL==arr){
// exit (1);
//}
int n1=n,i=1;
arr[0]=0;
// printf("%d %d",n,num);
while(n1--){
scanf("%d",&arr[i++]);
}
if(n<3){
if(n==1)
printf("%d\n",arr[1]);
else{
if(arr[1]<arr[2])
swap(&arr[1],&arr[2]);
printf("%d\n",arr[m]);
}
}
else
QSort(arr,1,n);
printf("%d\n",arr[n-m+1]);
//free(arr);
//swap(&arr[1],&arr[2]);
// printf("%d %d",arr[1],arr[2]);
//for(int l=1;l<(n+1);l++){
// printf("%d\n",arr[l]);
//}
}
return 0;
}
第k大的数
最新推荐文章于 2024-04-21 15:36:46 发布