第k大的数

来源:互联网 发布:浙江东方集团 知乎 编辑:程序博客网 时间:2024/04/30 15:53
题目描述要求在N个不重复的整数中,找出第K大的整数  ,其中0<K<N<1000000输入输入第一行为两个正整数N   K第二行为N个整数,输入保证这N个整数两两相异,每个整数的范围在-1000000到1000000之间输出输出第K大的整数值#include<string.h>#include<stdio.h>#include <malloc.h>#define N 100int 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;}

0 0
原创粉丝点击