786. 第k个数
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
int arr[1000005];
int main(){
int n, k;
scanf("%d%d",&n,&k);
int i;
for(i = 0; i < n; i++)
{
int x;
scanf("%d", &x);
arr[x] += 1;
}
int j;
int num = 0;
for(j = 0; num < k; j++)
{
if(arr[j] >= 1)
{
num+=arr[j];
}
}
printf("%d\n", j-1);
return 0;
}
方法二
#include<iostream>
using namespace std;
const int N = 1e5 + 10;
int n, k;
int q[N];
int quick_sort(int l, int r, int k)
{
if(l == r) return q[l];//边界
int x = q[l], i = l - 1, j = r + 1;
while(i < j)
{
while(q[++i] < x);
while(q[--j] > x);
if(i < j) swap(q[i], q[j]);
}
int s1 = j - l + 1;//左边
if(k <= s1) quick_sort(l, j, k);
else quick_sort(j + 1, r, k- s1);
}
int main(){
cin >> n >> k;
for(int i = 0; i < n; i++) scanf("%d", &q[i]);
cout << quick_sort(0, n - 1, k) << endl;
return 0;
}
方法三
#include<iostream>
using namespace std;
const int maxn=10010;
int a[maxn];
int partition(int a[],int left,int right)
{
int temp=a[left];
while(left<right)//只要left和right不相遇
{
while(left<right&&a[right]>temp)right--;//反复左移right
a[left]=a[right];
while(left<right&&a[left]<temp)left++;//反复右移left
a[right]=a[left];
}
a[left]=temp;//把temp放到left与right相遇的地方
return left;//返回相遇的下标
}
void quickSort(int a[],int left,int right)
{
if(left<right)//当前长度超过1
{
int pos=partition(a,left,right);//一分为二
quickSort(a,left,pos-1);
quickSort(a,pos+1,right);
}
}
int main()
{
int n,k;
cin>>n>>k;
for(int i=0;i<n;i++)
{
cin>>a[i];
}
quickSort(a,0,n-1);
cout<<a[k-1]<<endl;
return 0;
}
第四个
#include<iostream>
using namespace std;
const int N = 1e5 + 10;
int a[N];
void quick_sort(int a[],int l, int r)
{
if(l>=r)return ;
int x=a[l],i=l-1,j=r+1;
while(i<j)
{
while(a[++i]<x);
while(a[--j]>x);
if(i<j)
{
swap(a[i],a[j]);
}
}
quick_sort(a,l,j);
quick_sort(a,j+1,r);
}
int main()
{
int n, k;
cin >> n >> k;
for(int i = 0; i < n; i++) cin>>a[i];
quick_sort(a, 0, n-1);
cout<<a[k-1]<<endl;
return 0;
}