快速排序

昨天学了冒泡排序,今天我们大家来学习一下快速排序。

在写这个之前,我也是察看了很多博客的,十分感谢博主http://www.cnblogs.com/morewindows/archive/2011/08/13/2137415.html

http://blog.csdn.net/morewindows/article/details/6684558

http://blog.sina.com.cn/s/blog_5c5bc9070100y4zv.html



——————————————————————————————————————————————————————————————————————————


快速排序


概念:采取了分治策略。思想是:1.先从数列中选取一个数作为基准数 2.在分区时,将比这个数大的数都放在这个数的右边,比他小的或等于他的都放在他的左边。

3.在对左右区间都分别重复第二步,直到各个区间只有一个数。


————————————————————————————————————————————————————————————————————————————

好理解的挖坑填数+分治法:


挖坑填数:


先给一个数组:

0123456789
7265788604283734885


这个数组中,我们随便选取一个数,比如说0位置的72,那么我们在程序中,初始设置i=0;j=9;X=a[i]=72;(我们把一个额外的坑作为中间倒腾的地方,假设为X,i,j分别表示位置)

刚开始我们把a[0]=72的值放到了X的坑里,那a[0]这个坑就已经空着了,数组变成了:



0123456789
 657886042837348
85

 那么我们是不是要找比72小的数填到他的左边, 比72的数大的放到他的右边?可以这样操作:j=9,从后往前找一个比72小的数放到a[0],我们发现当j=8时,48<72,所以我们把48填到a[0]的位置,程序描述为:a[0]=a[8],i++;数组变为:


0123456789
486578860428373 
85
此时:i=1;j=8;X=72

那么我们a[8]的位置空出来了,我们要找比72大的数了,我们从i开始向后找大于72的数,当i=3时,88>72,符合条件,那么我们把a[8]=a[3];j--;数组变为:




此时 i=3,j=8;X=72


我们再重复上面的步骤,当j=5时,我们发现42<72,a[3]=a[5],i++;


0123456789
486574260 837388
85

此时i=5;j=5;X=72;由于i=j,所以把X填到a[5]中,此时数组变为:


0123456789
48657426072837388
85
通过上述变化,我们是不是把72放到了中间,左边0-4的位置上都是比72小的数字,而右边6-9都是比72大的数字。


接下来我们得递归了,对a[0]-a[4]区间,和a[6]-a[9]这两个子区间重复上述步骤。




好啦,接下来总结一下递归算法的文字描述吧:


1.i=L,j=R,将基数挖出形成第一个坑a[i];

2.j--;从后向前,找到一个比基数小的数,找到后把这个数填到a[i]中;

3.i++由前向后找到比它大的数,找到后把这个数挖出放到刚刚空出来的a[j]中;

4.重复2~3,直到i=j,将基数填到a[i]中。




明白了原理我们开始用代码实现一下吧:(实现暂时还没有运行~等后面我运行了在写。。。。。)

#include "stdafx.h"
#include<iostream>
#include<string>
using namespace std;
void quicksort(int a[],int l,int r);
int main()
{
	int a[10]={34,65,12,43,67,5,78,10,3,70};
	int len=sizeof(a)/sizeof(int);
	cout<<"the orginal array are"<<endl;
	for(int i=0;i<len;i++)
	{
		cout<<a[i]<<',';
	}
	cout<<endl;
	quicksort(a,0,len-1);
	cout<<"the sorted array are"<<endl;
	for(int i=0;i<len;i++)
	{
		cout<<a[i]<<',';
	}
	cout<<endl;
	return 0;
}
void quicksort(int a[],int l,int r)
{
	if(l<r)
	{
		int i=l;
		int j=r;
		int x;
		x=a[l];
		while(i<j)
		{
			while(i<j&&a[j]>x)
			{
				j--;
			}
			if(i<j)
			{
				a[i]=a[j];
				i++;
			}
			while(i<j&&a[i]<x)
			{
				i++;
				
			}
			if(i<j)
			{
				a[j]=a[i];
				j--;
			}
		}
		a[i]=x;
		quicksort(a,l,i-1);//递归调用
		quicksort(a,i+1,r);
	}
}
执行结果为:



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值