快速排序--可以实现求第k大数

/* 用快速排序实现求第k大数*/


#include <iostream>
#include<stdio.h>

using namespace std;
int arr[100];

int Partition(int left,int right){
int random=rand()%(right-left)+left;
swap(arr[left],arr[random]);
while(left<right){
    while(left<right&&arr[left]<arr[right]){
            right--;
        }
         swap(arr[left],arr[right]);
       while(left<right&&arr[left]<arr[right]){
        left++;
       }
        swap(arr[left],arr[right]);
    }
return left;//这里left和right是一样,返回哪个都OK。
}

/*
void Quicksort(int left,int right){//实现正常快速排序的Quicksort函数
if(left<right){
    int position=Partition(left,right);//选一个pivot下标
    Quicksort(left,position-1);
    Quicksort(position+1,right);
}

}
*/


//下面是实现查找第  K   大数的Quicksort函数
int  Quicksort(int left,int right,int k){
int position=Partition(left,right);
if(position==k-1){
    return arr[position];
}
else if(position<k-1){
    return Quicksort(position+1,right,k);
}
else{
    return Quicksort(left,position-1,k);
}

}

int main()
{int n;
scanf("%d",&n);
for(int i=0;i<n;i++){
    scanf("%d",&arr[i]);
}
int k;
scanf("%d",&k);
 printf("%d\n",Quicksort(0,n-1,k));

 //测试代码
/*
 for(int i=0;i<n;i++){
    printf("%d  ",arr[i]);
 }
*/


    return 0;
}

小结:用快排实现求第k大数可以实现O(n)的时间复杂度。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值