快速排序方法分而治之实现

快速排序方法分而治之实现

排序方法

用分而治之方法可以实现快速排序。假设一个数组Data[n],把这n个元素分成3段:left,middle,right段。middle段仅有一个元素,left段的元素都不大于中间段的元素,right段的元素都不小于middle段的元素。因此可以对left段和right段独立排序,并且排序后不用归并。middle段的元素称为划分元素。

伪代码

//对a[0:n-1]快速排序
1.从a[0:n-1]中选择一个元素作为划分元素,组成middle段。
2. 把剩余元素分为left段和right段。使left段的关键字都不大于middle关键字,right段的关键子都不小于middle字段的关键字。
3.对left段递归实现快速排序。
4.对right段递归实现快速排序。
5.最终按照left段,middle段,right段排列。

案例分析

已知元素数组【4,8,3,7,1,5,6,2】。
假设选择6元素作为middle划分元素。
left段为4,3,1,5,2;
right段为8,7
left段的排序结果为1,2,3,4,5(快速排序的结果);
right段的排序结果为7,8;
将right段放在middle右边,把left段放在middle左边,即可得到答案【1,2,3,4,5,6,7,8】。

C++实现

//本函数的目的用quickSort把数组a中的最大元素移动到数组的最右端
template<class T>
void quickSort(T a[],int n)
{//对a[0,n-1]快速排序
	if(n<=1)return ;
	//把最大的元素移动到数组的最右端
	int max=indexOfMax(a,n);
	swap(a[n-1],a[max]);
	quickSort(a,0,n-2);
}
//本函数执行快速排序
template<class T>
void quickSort(T a[],int leftEnd,int rightEnd)
{//对a[leftEnd:rightEnd]排序,a[rightEnd+1]>=a[leftEnd:rightEnd]
	if(leftEnd>=rightEnd)return;
	int leftCursor=leftEnd;    //从左至右移动的索引
	int rightCursor=rightEnd+1;//从右到左移动的索引
	T pivot=a[leftEnd];
	//将位于左侧不小于支点的元素和位于右侧不大于支点的元素交换位置
	while(true)
	{
		do//寻找左侧不小于支点的元素
		{
			leftCursor++;
		}while(a[leftCursor<pivot);
		do//寻找右侧不大于支点的元素
		{
			rightCursor--;
		}
		while(a[rightCursor]>pivot)
		if(leftCursor>=rightCursor)break;
		swap(a[leftCursor],a[rightCursor]);
		//放置支点
		a[leftEnd]=a[rightCursor];
		a[rightCursor]=pivot;
		quickSort(a,leftEnd,rightCursor-1);//对左段的数组排序
		quickSort(a,rightCursor+1,rightEnd);//对右侧的数段排序
	}
}

猜你喜欢

转载自blog.csdn.net/qq_16668303/article/details/89287209