#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std;
const int N = 10;
int arr[N];
/******************快速排序稳定版本*************************************/
void QuickSort(int low, int high)
{
if(low >= high)
return ;
int i, j, pivot;
i = low, j = high, pivot = arr[(high + low) >> 1]; //每次取中间元素作为基准
swap(arr[low], arr[(high + low) >> 1]);
while(i < j)
{
while(i < j && arr[j] >= pivot) --j;
arr[i] = arr[j];
while(i < j && arr[i] <= pivot) ++i;
arr[j] = arr[i];
}
arr[i] = pivot;
QuickSort(low, i - 1); //递归左边
QuickSort(j + 1, high); //递归右边
}
/*************************************************************************/
/******************快速排序一般版本(可求第K大元素)*****************/
int Partition(int low, int high)
{
int i, j, pivot;
i = low, j = high, pivot = arr[low];
while(i < j)
{
while(i < j && arr[j] >= pivot) --j;
if(i < j) swap(arr[i++], arr[j]);
while(i < j && arr[i] <= pivot) ++i;
if(i < j) swap(arr[i], arr[j--]);
}
return j; //返回基准元素位置
}
void Quick_Sort(int low, int high)
{
int pivotpos;
if(low < high)
{
pivotpos = Partition(low, high);
Quick_Sort(low, pivotpos - 1); //基准左递归排序
Quick_Sort(pivotpos + 1, high); //基准右递归排序
}
}
int select(int low, int high, int k)
{
int pivotpos, num;
if(low == high)
return arr[high];
pivotpos = Partition(low, high);
num = pivotpos - low + 1; //左边元素个数
if(k == num)
return arr[pivotpos];
else if(k < num)
return select(low, pivotpos - 1, k);
else
return select(pivotpos + 1, high, k - num);
}
/*************************************************************************/
int main()
{
int k;
cout<<"输入10个数字:"<<endl;
for(int i = 0; i < 10; ++i)
scanf("%d", &arr[i]);
QuickSort(0, 9);
cout<<"快速排序后:"<<endl;
for(int i = 0; i < 10; ++i)
cout<<arr[i]<<" ";
cout<<endl;
cout<<"输入第K大元素:"<<endl;
cin>>k;
cout<<select(0, 9, k)<<endl;
return 0;
}
快速排序
最新推荐文章于 2023-12-01 23:14:38 发布