快速排序是一个递归的算法(递归)
一次排序结束,基数左边的数都比基数小,基数右边的数,都比基数大
再对其左边和右边进行排序。而不用进行任何合并
#include <iostream>
#include <cstdio>
using namespace std;
int a[100];
int n;
void quickSort(int bg,int ed)//[)
{
if(bg >= ed)
return;
int i = bg,j = ed;
int base= a[bg];
while(i < j){
while(a[j] >= base && j > i)
{
j --;
}
while(a[i]<= base && i < j)
{
i ++;
}
printf("i = %d,j = %d\n",i,j);
if(i <j){
int t = a[i];
a[i] = a[j];
a[j] = t;
}
}
a[bg] = a[i];
a[i] = base;
quickSort(bg,i - 1 );
quickSort(i + 1,ed);
}
int main()
{
//freopen("in.txt","r",stdin);
scanf("%d",&n);
for(int i = 0; i < n; i ++)
{
scanf("%d",&a[i]);
}
quickSort(0,n - 1 );
for(int i = 0; i < n; i ++)
{
printf("%d ",a[i]);
}
printf("\n");
return 0;
}
利用快排求解第k小的数,时间复杂度认为比n大比nlogn小
当k小于左边的个数递归左边,当k大于左边的个数递归右边,当k刚好等于基数的位置返回即可
附代码
#include <iostream>
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
int a[100005];
int b[100005];
void quickSort(int bg,int ed,int k)//[)
{
if(bg >= ed)
return;
int i = bg,j = ed;
int base= a[bg];
while(i < j){
while(a[j] >= base && j > i)
{
j --;
}
while(a[i]<= base && i < j)
{
i ++;
}
if(i <j){
int t = a[i];
a[i] = a[j];
a[j] = t;
}
}
a[bg] = a[i];
a[i] = base;
if(k == i - bg + 1)
return;
else if(i - bg >= k)
quickSort(bg,i - 1,k);
else
quickSort(i + 1,ed,k - i + bg - 1);
}
int main()
{
//freopen("ub.txt","r",stdin);
int n,m,bg,ed,k;
scanf("%d%d",&n,&m);
for(int i = 1; i <= n; i ++)
{
scanf("%d",&b[i]);
}
for(int i = 0; i < m; i ++)
{
int num = 1;
scanf("%d%d%d",&bg,&ed,&k);
for(int i = bg; i <= ed; i ++)
{
a[num++] =b[i];
}
quickSort(1,num -1,k);
printf("%d\n",a[k]);
}
return 0;
}
此题是按照poj 2104写的,但会超时