文章目录
- 一、 P1923 【深基9.例4】求第 k 小的数
- 二、思想方法
- 2、代码
- 3、细节
一、 P1923 【深基9.例4】求第 k 小的数
题目:
二、思想方法
首先我们来看核心代码,也就是通过快排,将K的位置找出
void my_sort(int arr[],int left,int right,int k)
{
int i = left;
int j = right;
int mid = arr[(left+right)/2];//定义一个哨兵
while(i<=j)
{
while(arr[i]<mid)
i++;
while(arr[j]>mid)
j--;
if(i<=j)
{
Swap(arr,i,j);
i++;
j--;
}
}
if(k<=j)
my_sort(arr,left,j,k);
else if(k>=i)
my_sort(arr,i,right,k);
else if(k>=j&&k<=i)
return ;
}
通过快排,将该数组的数进行排序,判断出K在i,j的什么位置,如图
如果k在j和i的中间则,找到返回就行
如果k在j的左边,则在left到j的位置再次排序
如果k在i的右边,则在i到left的位置再次排序
知道k在j和i的中间退出递归
2、代码
#include <iostream>
using namespace std;
int n,k,arr[5000010];
//进行交换
void Swap(int* a,int* b)
{
int tmp = *a;
*a = *b;
*b = tmp;
}
void my_sort(int left,int right)
{
int i = left;
int j = right;
//定义哨兵
int mid = arr[(left+right)/2];
while(i<=j)
{
while(arr[i]<mid)
i++;
while(arr[j]>mid)
j--;
if(i<=j)
{
Swap(&arr[i],&arr[j]);
i++;
j--;
}
}
if(k<=j)
my_sort(left,j);
else if(k>=i)
my_sort(i,right);
else if(k>=j&&k<=i)
return;
}
int main()
{
std::ios::sync_with_stdio(false);//进行对输入输出优化
int i;
cin>>n>>k;
for(i=0;i<n;i++)
{
cin>>arr[i];
}
//进行排序
my_sort(0,n-1);
//输出
cout<<arr[k];
return 0;
}
3、细节
在做这题的时候由于数字都比较大,我们可以使用
std::ios::sync_with_stdio(flase)
代码进行对输入输出优化,以达到对时间限制的要求