快速排序求无序序列第K大的数
快速排序
//快速排序
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int MAXN = 1010;
int arr[MAXN];
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;
}
void QuickSort(int left,int right){
if(left < right){
int position = Partition(left,right);
QuickSort(left,position - 1);
QuickSort(position + 1,right);
}
}
void display(int len){
for(int i = 0; i < len - 1; ++i){
cout<<arr[i]<<" ";
}
cout<<arr[len - 1]<<endl;
}
int main(){
int n;
cin>>n;
for(int i = 0;i < n;++i){
cin>>arr[i];
}
QuickSort(0,n-1);
display(n);
return 0;
}
求第K大的数
基本思想为对快排进行剪枝
//快速排序求无序序列第K大的数
//类似于剪枝
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int MAXN = 1010;
int arr[MAXN];
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;
}
void QuickSort(int left,int right){
if(left < right){
int position = Partition(left,right);
QuickSort(left,position - 1);
QuickSort(position + 1,right);
}
}
int QuickSort_K(int left,int right,int k){
if(left < right){
int position = Partition(left,right);
if(position == k - 1){
return arr[position];
}
else if(position < k - 1){
return QuickSort_K(position + 1,right,k);
}
else{
return QuickSort_K(left,position - 1,k);
}
}
}
void display(int len){
for(int i = 0; i < len - 1; ++i){
cout<<arr[i]<<" ";
}
cout<<arr[len - 1]<<endl;
}
int main(){
int n;
cin>>n;
for(int i = 0;i < n;++i){
cin>>arr[i];
}
QuickSort(0,n-1);
cout<<"排序后的序列为:";
display(n);
int k;
cin>>k;
cout<<"第"<<k<<"大的数为:"<<QuickSort_K(0,n-1,k)<<endl;
return 0;
}