快速排序简单应用

一 快速排序基本思想步骤:在实际应用中,要 用到递归,反复进行分割,分割后又快速排序。

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;
}


 


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值