快速排序的核心思路是:
1 找一个基本的数,做到每次排序时,基数左边的数都比基本数小,基数右边的数都比基本数大。依次再对左右序列重复此操作。
具体操作步骤大致如下:
1)设置两个变量I、J,排序开始的时候I:=1,J:=N;
2)以第一个数组元素作为关键数据,赋值给X,即X:=A[1];
3)从J开始向前搜索,即由后开始向前搜索(J:=J-1),找到第一个小于X的值,两者交换;
4)从I开始向后搜索,即由前开始向后搜索(I:=I+1),找到第一个大于X的值,两者交换;
5)重复第3、4步,直到I=J;
代码实现如下:
void QuickSort(int* array, int length)
{
if (length <= 1)
{
return;
}
//寻找分界值
//快速排序使用2个下标
int frontIndex = 1, backIndex = length - 1;
int curIndex = 0;
bool bBackoff = true; //从后面后退
while (frontIndex <= backIndex)
{
int frontValue = array[frontIndex];
int backValue = array[backIndex];
//int compareIndex = bBackoff ?backIndex:frontIndex;
if (bBackoff)
{
//后退
if (array[curIndex] > array[backIndex])
{
int tmpValue = array[curIndex];
array[curIndex] = array[backIndex];
array[backIndex] = tmpValue;
curIndex = backIndex;
bBackoff = !bBackoff;
}
backIndex--;
}
else
{
if (array[curIndex] < array[frontIndex])
{
int tmpValue = array[curIndex];
array[curIndex] = array[frontIndex];
array[frontIndex] = tmpValue;
curIndex = frontIndex;
bBackoff = !bBackoff;
}
frontIndex++;
}
}
int leftLength = curIndex; ///当右侧得数全部比 array[0]大时,curIndex 为0 会出现递归结束不了,所以 length <=1 时结束递归。 curIndex是 分界值得下标
QuickSort(array, leftLength);
QuickSort(array + curIndex + 1, length - leftLength - 1);
}
int main() {
int array[] = {12,31,1,21,11,3,56,14,89,10};
int length = sizeof(array) / sizeof(array[0]);
QuickSort(array,length);
std::for_each(array,array+length,[](int i){
std:: cout << i << " ";
});
std::cout << std::endl;
cout << "test\n";
return 0;
}
快速排序先从后面开始比较,只有交换时才换方向比较。
快速比较是不稳定得排序算法。