快速排序的两种思路(C++实现)

双边循环法

#include<iostream>
using namespace std;

int partition(int array[],int startIndex,int endIndex);
void quickSort(int array[],int startIndex,int endIndex){
	//递归终止条件,startIndex>=endIndex
	if(startIndex>=endIndex)
		return;
	//得到基准元素的位置
	int pivotIndex=partition(array,startIndex,endIndex);
	//根据基准元素,分成两部分进行递归排序
	quickSort(array,startIndex,pivotIndex-1);
	quickSort(array,pivotIndex+1,endIndex);
}

//分治(双边循环法)
int partition(int array[],int startIndex,int endIndex){
	//取第1个位置的元素作为基准元素
	int pivot=array[startIndex];
	int left=startIndex;
	int right=endIndex;
	while(left!=right){
		//控制right指针比较并左移
		while(left<right&&array[right]>pivot){
			right--;
		} 
		//控制left指针比较并右移
		while(left<right&&array[left]<=pivot){
			left++;
		} 
		//交换left和right指针所指向的元素
		if(left<right){
			int temp=array[left];
			array[left]=array[right];
			array[right]=temp;
		} 
	} 
	//pivot和指针重合点交换
	array[startIndex]=array[left];
	array[left]=pivot;
	
	return left; 
} 
int main()
{
	int array[]={4,7,6,5,3,2,8,1};
	int length=sizeof(array)/sizeof(array[0]);
	quickSort(array,0,length-1);
	for(int i=0;i<length;i++)
		cout<<array[i]<<" ";
	return 0;
}

单边循环法

#include<iostream>
using namespace std;

int partition(int array[],int startIndex,int endIndex);
void quickSort(int array[],int startIndex,int endIndex){
	//递归终止条件,startIndex>=endIndex
	if(startIndex>=endIndex)
		return;
	//得到基准元素的位置
	int pivotIndex=partition(array,startIndex,endIndex);
	//根据基准元素,分成两部分进行递归排序
	quickSort(array,startIndex,pivotIndex-1);
	quickSort(array,pivotIndex+1,endIndex);
}

//单边循环法和双边循环法的不同体现在partition函数内部。 
//单边循环法在开始时和双边循环法类似,都是首先选定基准元素pivot。同时
//设置一个mark指针指向数列其实位置,这个mark指针代表小于基准元素的区域边界
//接下来,从基准元素的下一个位置开始遍历数组:若遍历到的元素大于基准元素,就继续往后遍历, 
//若遍历到的元素小于基准元素,则需要做两件事:第一。mark指针右移1位,因为小于pivot的
//区域边界增大了1;第二,让最新遍历到的元素和mark指针所在位置的元素交换位置,因为最新遍历的元素
//归属于小于pivot的区域。partition函数实现如下: 
//分治(单边循环法)
int partition(int array[],int startIndex,int endIndex){
	//取第1个位置的元素作为基准元素
	int pivot=array[startIndex];
	int mark=startIndex;
	
	for(int i=startIndex+1;i<=endIndex;i++){
		if(array[i]<pivot){
			mark++;
			int temp=array[mark];
			array[mark]=array[i];
			array[i]=temp;
		}
	} 
	
	array[startIndex]=array[mark];
	array[mark]=pivot;
	return mark;
} 
int main()
{
	int array[]={4,7,6,5,3,2,8,1};
	int length=sizeof(array)/sizeof(array[0]);
	quickSort(array,0,length-1);
	for(int i=0;i<length;i++)
		cout<<array[i]<<" ";
	return 0;
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值