快速排序作为最常用和最有效的排序算法之一,其递归和分治的思想也是值得好好借鉴的。
下面进行详细说明:
代码如下:
int _quick_sort(int array[], int start, int end)
{
//进行排序后获得中间值
int i = start, j = end;
int temp_value = array[start];
while(i < j)
{
while(i < j && array[j] >= temp_value)
j--;
if(i < j)
{
array[i] = array[j];
}
while(i < j && array[i] <= temp_value)
i++;
if(i < j)
{
array[j] = array[i];
}
}
array[i] = temp_value;
return i;
}
void quick_sort(int array[], int start, int end)
{
if(NULL == array || start >= end)
return ;
// if(start >= end)return;
int middle = _quick_sort(array, start, end);
// cout<<middle<<endl;
// if(middle != 0)
quick_sort(array, start, middle -1);
quick_sort(array, middle + 1, end);
}
快速排序是找出一个元素(理论上可以随便找一个)作为基准(pivot),然后对数组进行分区操作,使基准左边元素的值都不大于基准值,基准右边的元素值 都不小于基准值,如此作为基准的元素调整到排序后的正确位置。递归快速排序,将其他n-1个元素也调整到排序后的正确位置。最后每个元素都是在排序后的正 确位置,排序完成。所以快速排序算法的核心算法是分区操作,即如何调整基准的位置以及调整返回基准的最终位置以便分治递归。
对数组{5,3,6,2,1,9,3,4,8,0}进行排序:
一趟排序如下:
[0,3,6,2,1,9,3,4,8,,0] //从该序列最后一个数开始比较,0<5:将5位置的数赋值为0
[0,3,6,2,1,9,3,4,8,6] //有不满足条件的,赋值后改变比较顺序,从开始比较,0<5,继续;3<5,继续;6>5,将上一个数0位置的数赋值为6
[0,3,4,2,1,9,3,4,8,6] //重复上面步骤,从6位置处开始比较
[0,3,4,2,1,9,3,9,8,6] //从4位置处开始比较
[0,3,4,2,1,3,3,9,8,6] //当比较两数的下标相同时,插入中间值。
[0,3,4,2,1,3,5,9,8,6] //完成一趟排序。
下面分别对[034213], [986]进行相同方法递归排序,即可得到结果。
若不明白,可仔细看代码实现。
总结:1:验证参数的合法性
2:理解快排的思想步骤,知道在什么地方退出比较。