数据结构之快速排序

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

 


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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小巫技术博客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值