数据结构之快速排序

/*3.  编写一个快速排序的算法,并且在main函数中验证其功能已实现
*快速排序(Quick Sort)又称划分交换排序,基本思想:在待排序的n
*个记录中记录中任取一个作为“基准”,将其余记录分为两组,第一组中
*各记录的键值均小于或等于基准的键值,第二组中各记录的键值均大于
*或等于基准的键值,而基准就排在这两组中间(这也是该记录的最终位置),
*这称为一趟快速排序(或一次划分)。对所分成的两组分别重复上述方法,
*直到所有记录都排在适当位置为止。
*快速排序过程实际上是一种“分治法”:通过划分得到两个子区间,对每个子
*区间进行同样出理后,将结果组合起来就是问题的解。
*/
#include<iostream>
using namespace std;
const int maxsize=100;					//排序表容量,假设为100
typedef int datatype;
typedef struct
{
	datatype key;						//关键字
}	rectype;							//记录类型
typedef rectype list[maxsize+1];		//排序表类型,0号单元不用

//快速排序一次划分算法
int Partition(list R,int p,int q)		//对无序区R[p]到R[q]划分,返回划分后基准的位置
{
	int i,j;
	i=p;
	j=q;
	R[0]=R[i];							//R[0]作为辅助量x,存放基准,基准取为无序区第一个记录
	while(i<j)
	{
		while(R[j].key>=R[0].key && i<j) j--;	//从右向左做扫描
		if(R[j].key<R[0].key)
		{
			R[i]=R[j];							//交换R[i]和R[j]
			i++;
		}
		while(R[i].key<=R[0].key && i<j) i++;	//从左想右做扫描
		if(R[i].key>R[0].key)
		{
			R[j]=R[i];							//交换R[i]和R[j]
			j--;
		}
	}
		R[i]=R[0];								//将基准移到最后的正确位置
		return i;
}

	//快速排序主算法
	void Quicksort(list R,int s,int t)			//对R[s]到R[t]快速排序
	{
		int i;
		if(s>=t) return;
		i=Partition(R,s,t);
		Quicksort(R,s,i-1);
		Quicksort(R,i+1,t);
	}


	//主函数测试快速排序功能
	int main()
	{
		list R;
		const int n=8;
		cout<<"come on  baby,welcome to my C++ world!!!!"<<endl;
		cout<<"please enter the key:"<<endl;
		for(int i=1;i<=n;i++)						//输入关键字
			cin>>R[i].key;
		cout<<"input the unsorted keys:"<<endl;
		for(int i=1;i<=n;i++)						//输出为排序前的序列
			cout<<R[i].key<<" ";
		cout<<endl;
		cout<<"调用快速排序函数!!!"<<endl;
		Quicksort(R,1,n);						//对整个排序表进行快速排序
		cout<<"经过快速排序后的序列:"<<endl;
		for(int i=1;i<=n;i++)					//输出排序后的序列
			cout<<R[i].key<<" ";
		system("pause");
		return 0;
	}


下面给出一次划分的过程:
初始关键字: [4938659776132749']
j向左扫描↑↑
i←j
[4938659776132749']
↑ ↑
i j
第一次交换后: [273865977613[]49']
i→j
[273865977613[]49']
i→ j
第二次交换后: [2738[]9776136549']
j向左扫描,位置不变 i ←j
第三次交换后: [2738139776[]6549']
i向右扫描,位置不变 i→j
第四次交换后: [273813[]76976549']
j向左扫描 i←j
[2738134976976549']
↑↑
基准最后位置 i j
各趟排序之后的状态:
初始关键字:[4938659776132749']
一趟排序后:[273813] 49[76976549']
二趟排序后:[13] 27 [38] 49 [49' 65] 76 [97]
三趟排序后:1327384949'[65] 7697
最后的排序结果:1327384949'657697
*/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值