定义:
如果对所有的i=1,2,..,n-k有下式成立,我们就称一个包含n个元素的数组A为k排序的:
题目:编写程序,使能在O(nlgn/k)内对n个元素进行k排序:
#include <iostream>
#include <time.h>
#include "stdlib.h"
using namespace std;
const int n=10;
int RANDOM(int p,int r)
{
int t=rand()%(r-p+1)+p;
return t;
}
int PARTITION(int A[],int p,int r)
{
int q=RANDOM(p,r);
swap(A[r],A[q]);
int x=A[r];
int i=p-1;
for (int j=p;j<=r-1;j++)//O(n)
{
if (A[j]<=x)
{
i++;
swap(A[i],A[j]);
}
}
swap(A[i+1],A[r]);
return i+1;
}
void QUICKSORT(int A[],int p,int r,int k)
{
if (p<r&&k<r-p)//小于等于k时停止递归。其递归深度为lg(n/k)。
{
int q=PARTITION(A,p,r);
QUICKSORT(A,p,q-1,k);
QUICKSORT(A,q+1,r,k);
}
}
void Print(int A[])
{
for (int i=0;i<n;i++)
{
cout<<A[i]<<" ";
}
}
int main()
{
int A[n]={0};
srand( (unsigned)time( NULL ) );
for (int i=0;i<n;i++)
{
A[i]=rand()%100;
}
Print(A);
cout<<endl;
QUICKSORT(A,0,n-1,2);//k=2
Print(A);
cout<<endl;
}
本次采用的是随机的快速排序