目录
题目描述
给定一个大小为n(1≤n≤1000000)且无序的整型数组,数组中可能存在相同元素,请找出该数组第k(1≤k≤n)小的元素,注意这里的第k小元素指的是按从小到大排序后的第k个位置上的元素。
输入格式:
每个输入文件为一个测试用例,每个文件的第一行给出两个正整数n和k,第二行给出n个整数,其间以空格分隔。
输出格式:
输出第k小元素的值。
输入样例:
10 4 2 3 5 12 4 9 3 8 2 9
输出样例:
3
解题思路:
找到排好序的数组中倒数第k个数即可
详细代码:
#include<iostream> #include<algorithm> using namespace std; int main() { int a,b; cin>>a>>b; int c[a]; for(int i=0;i<a;i++)cin>>c[i]; sort(c,c+a);//algorithm库中自带的排序函数 printf("%d",c[b-1]); }
快速排序拓展:
此题应该是为了练习快速排序,而出的
详细代码如下,采用分治的思想
#include <iostream> using namespace std; const int N=1000010; int q[N]; int quick_sort(int l,int r,int k) { if(l>=r) return q[l];//数组中只剩一个数,就是要找的元素 int i=l-1,j=r+1,x=q[l+r>>1];//这个快速排序以中间元素为分界线 while(i<j) { do i++;while(q[i]<x); do j--;while(q[j]>x); if(i<j)swap(q[i],q[j]);//交换下标i和j元素的位置 } if(j+1>=k)//k在分界线左边,处理左区间数组 { return quick_sort(l,j,k); } else //否则k在分界线右边,处理右区间数组 { return quick_sort(j+1,r,k); } } int main() { int n,k; cin>>n>>k; for (int i=0;i<n;i++){ cin>>q[i]; } cout<<quick_sort(0,n-1,k)<<endl; return 0; }