【排序算法】快速排序

代码如下

/*
描述:快速排序实现及验证,快速排序是不稳定算法,比如5,5,5,4
*/
#include <iostream>

using namespace std;

/*
描述:用于将排序数列分为两组,并返回中轴值位置
*/
int Partition(int arr[], int iStart, int iEnd)
{
	int iPivotVal = arr[iEnd];
	int iPivotPos = iStart - 1;
	int iTmp = 0;

	for(int j = iStart; j < iEnd; j++)
	{
		if(arr[j] <= iPivotVal)
		{
			iPivotPos ++;
			iTmp = arr[j];
			arr[j] = arr[iPivotPos];
			arr[iPivotPos] = iTmp;
		}
	}

	arr[iEnd] = arr[++iPivotPos];
	arr[iPivotPos] = iPivotVal;
	

	return iPivotPos;
}

/*
描述:快速排序
*/
void QuickSort(int arr[], int iStart, int iEnd)
{
	if(iStart < iEnd)
	{	
		int iPivotPos = Partition(arr, iStart, iEnd);

		QuickSort(arr, iStart, iPivotPos - 1);
		QuickSort(arr, iPivotPos + 1, iEnd);
	}
}

/*
描述:输出序列
*/
void Output(int iArr[], int iLen)
{
	for(int i = 0; i < iLen; i++)
	{
		cout << iArr[i] << " ";
	}
}

int main()
{
	int arr[] = {2,8,7,1,3,5,6,4};

	int iLen = sizeof(arr)/sizeof(arr[0]);
	
	Output(arr,iLen);

	QuickSort(arr, 0, iLen - 1);

	cout << "After Sort" << endl;

	Output(arr, iLen);
}

分区流程

每一个分区调用的流程如下图,在每一步中有如下特征:

[p,i]之间的数值都是<=枢轴值

[i+1,j]之间的数值都是>枢轴值

[j+1,r-1]之间的数值都是不确定的,还没有进行分区排序

[r,r]就是枢轴值


猜你喜欢

转载自blog.csdn.net/zamely/article/details/80732114