代码如下
/*
描述:快速排序实现及验证,快速排序是不稳定算法,比如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]就是枢轴值