题目
P1923 【深基9.例4】求第 k 小的数
# 【深基9.例4】求第 k 小的数
## 题目描述
输入 n(1≤n<5000000且n 为奇数个数字 ai(1≤ai<10^9),输出这些数字的第 k 小的数。最小的数是第 0 小。
请尽量不要使用 nth_element
来写本题,因为本题的重点在于练习分治算法。
## 输入格式
## 输出格式
## 样例 #1
### 样例输入 #1
5 1
4 3 2 1 5
### 样例输出 #1
2
快速排序
想完成这道题,我们得先了解快速排序及代码
#include<stdio.h>
int a[101],n;//定义全局变量,这两个变量需要在子函数中使用
void quicksort(int left,int right)
{
int i,j,t,temp;
if(left>right)
return;
//temp中存的就是基准数
temp=a[left];
i=left;
j=right;
while (i!=j)
{ //顺序很重要,要先从右往左找
while (a[j]>=temp&&i<j)
{
j--;
}
while(a[i]<=temp&&i<j)//再从左往右找
{
i++;//交换两个数在数组中的位置
}
if(i<j)//当哨兵i和哨兵j没有相遇时
{
t=a[i];
a[i]=a[j];
a[j]=t;
}
}
//最终将基准数归位
a[left]=a[i];
a[i]=temp;
quicksort(left,i-1);//继续处理左边的,这里是一个递归的过程
quicksort(j+1,right);//继续处理右边的,这里是一个递归的过程
return;
}
int main()
{
int i;//读入数据
scanf("%d",&n);
for(i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
//快速排序调用//输出排序后的结果
quicksort(1,n);
for(i=1;i<=n;i++)
{
printf("%d\n",a[i]);
}
return 0;
}
(来自于啊哈算法)
题解
我们了解了快速排序之后,再举一反三,照葫芦画瓢就可以完成这道题了
#include<stdio.h>
int a[5000000];
void quicksort(int left,int right){
int i,j;
if(left>right){
return;
}
int temp=a[left];
i=left;
j=right;
while(i!=j){
while(a[j]>=temp&&i<j){
j--;
}
while(a[i]<=temp&&i<j){
i++;
}
if(i<j){
int t=a[i];
a[i]=a[j];
a[j]=t;
}
}
a[left]=a[i];
a[i]=temp;
quicksort(left,i-1);
quicksort(i+1,right);
}
int main(){
int n,k;
scanf("%d %d",&n,&k);
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
}
quicksort(0,n-1);
printf("%d",a[k]);
}