进一步理解快速排序

一、 快速排序递归实现 

        快速排序应该是数据结构中比较基础也用的最广泛的的排序了,以下是它的递归实现。

int QKpass(int left,int right)
{
	int k;
	int low=left,high=right;
	k=data[low];
	while(low<high)
	{
		while(low<high&&data[high]>k)
			high--;
		if(low<high)
		{
			data[low]=data[high];
			low++;
		}
		while(low<high&&data[low]<k)
			low++;
		if(low<high)
		{
			data[high]=data[low];
			high--;
		}
	}
	data[low]=k;
	return low;	
}

void QKsort(int low,int high)
{
	if(low<high)
	{
		int k=QKpass(low,high);
		QKsort(low,k-1);
		QKsort(k+1,high);
	}
}


二、 快速排序非递归实现  

       另外在实际应用中递归调用的代价比较高,对快速排序的过程进行一下思考,快排每次总是对前面的部分处理,若前面的部分有序了然后再处理

后面的部分,过程如下图(图是自己画的,将就着看,呵呵),图中标明了递归快速排序的顺序。假设每次划分我们可以得到一个1:1的划分,我们

需要将打箭头的元素保存起来,每当要划分的元素集小于2的时候就将打箭头的元素弹栈对后半部分的元素进行处理。


以下是一个快速排序的非递归版本:

#include<iostream>
#include <vector>

using namespace std;

inline void swap(int *DATA,int x,int y)
{
	//DATA[x]=DATA[x]^DATA[y];
	//DATA[y]=DATA[x]^DATA[y];
	//DATA[x]=DATA[x]^DATA[y];
	int temp;
	temp=DATA[x];
	DATA[x]=DATA[y];
	DATA[y]=temp;
}

int Pation(int *DATA,int low,int high)
{
	if(high>low)
	{
		int i;
		i=low-1;
		for(int k=low;k<high;k++)
		{
			if(DATA[k]<DATA[high])
			{
				i++;
				swap(DATA,i,k);	
			}
		}
		swap(DATA,i+1,high);
		return i+1;
	}
	else
		return high;
}

void QuickSort(int *DATA,int beg,int end)
{
	vector<int> vec(10);
	int low=beg;
	int high=end;
	int k;
	vec.push_back(high);
	while(1)
	{
		k=Pation(DATA,low,high);
		if(k==end)
			break;
		while(k>low)
		{
			vec.push_back(k);
			k=Pation(DATA,low,k-1);
		}
		low=k+1;
		if(vec.size()==0)
			high=end;
		else
		{
			high=vec.back();
			vec.pop_back();
		}
	}

}

int main()
{
	int a[]={6,11,2,7,17,1,5,4,2,8,9,5,23,4,5,15,7,15};
	QuickSort(a,0,17);
	for(int i=0;i<17;i++)
		cout<<a[i]<<" ";
	getchar();
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值