一 快速排序基本思想步骤:在实际应用中,要 用到递归,反复进行分割,分割后又快速排序。
1.在表第一个、中间一个与最后一个元素中取中间值项,设为P(k),并将P(k)赋予T,再将表的第一个元素移动P(k)的位置;
2.然后设指针i,j分别指向表的起始和最后位置。
3.反复做以下两步:(1)将 j 逐渐减小,并逐次比较P(j)与T,直到发现P(j)<T为止,将p(j)移到p(i)的位置上;
(2)将 i 逐渐增加,并逐次比较P(i)与T,直到发现P(i)>T为止,将p(i)移到p(j)的位置上。
4.上述交替进行,直到指针i和j指在同一位置(i=j)为止,此时再将T移到P(i)位置。
二 快速排序C++表示:
#include <iostream>
#include "bubSort.h" //冒泡排序
using namespace std;
template <class T>
void qck(T p[],int n)
{
int m,i;
T *s;
if(n>10) //子表长度大于10,用快速排序
{
i=split(p,n); //对表进行分割
qck(p,i); //对前面的表进行快速排序
s=p+(i+1);
m=n-(i+1);
qck(s,m); //对后面的表进行快速排序
}
else
bubsort(p,n); //子表长度小于10,用冒泡排序
return;
}
template <class T>
static int split(T p[],int n)
{
int i,j,k,l;
T t;
i=0;j=n-1;
k=(i+j)/2;
if((p[i]>=p[j])&&(p[j]>=p[k])) l=j; //从第一个值,中间值,最后值,中选取中间值作为标记
else if((p[i]>=p[k])&&(p[k]>=p[j])) l=k;
else l=i;
t=p[l]; //选取一个元素为T
p[l]=p[i];
while(i!=j)
{
while((i<j)&&(p[j]>=t)) //逐渐减小j,直到发现p[j]<t
j=j-1;
if(i<j)
{
p[i]=p[j];i=i+1;
while((i<j)&&(p[i]<=t)) //逐渐增大i,直到发现p[i]>t
i=i+1;
if(i<j)
{
p[j]=p[i];j=j-1;
}
}
}
p[i]=t;
return(i);//返回分界线位置
}
三 具体应用实例:
#include "qck.h"
#include <iomanip>
#include <ctime>
int main()
{
int i,j;
/* double p[50],r=1.0;*/
int p[50];
// for(i=0;i<50;i++) //产生50个0~1之间的随机数
// {
// r=2053.0*r+13849.0;j=r/65536.0;
// r=r-j*65536.0;p[i]=r/65536.0;
// }
// for(i=0;i<50;i++) //产生50个100~300之间的随机数
// {
// p[i]=100.0+200.0*p[i];
// }
srand(time(0));
for(i=0;i<50;i++)
{
p[i]=rand()%500;
}
cout<<"排序前的序列:"<<endl;
for(i=0;i<10;i++)
{
for(j=0;j<5;j++)
cout<<setw(10)<<p[5*i+j];
cout<<endl;
}
qck(p,50);
cout<<"排序后的序列:"<<endl;
for(i=0;i<10;i++)
{
for(j=0;j<5;j++)
cout<<setw(10)<<p[5*i+j];
cout<<endl;
}
return 0;
}
四 实验结果:
#include "qck.h"
#include <iomanip>
#include <ctime>
int main()
{
int i,j;
/* double p[50],r=1.0;*/
int p[50];
// for(i=0;i<50;i++) //产生50个0~1之间的随机数
// {
// r=2053.0*r+13849.0;j=r/65536.0;
// r=r-j*65536.0;p[i]=r/65536.0;
// }
// for(i=0;i<50;i++) //产生50个100~300之间的随机数
// {
// p[i]=100.0+200.0*p[i];
// }
srand(time(0));
for(i=0;i<50;i++)
{
p[i]=rand()%500;
}
cout<<"排序前的序列:"<<endl;
for(i=0;i<10;i++)
{
for(j=0;j<5;j++)
cout<<setw(10)<<p[5*i+j];
cout<<endl;
}
qck(p,50);
cout<<"排序后的序列:"<<endl;
for(i=0;i<10;i++)
{
for(j=0;j<5;j++)
cout<<setw(10)<<p[5*i+j];
cout<<endl;
}
return 0;
}