将一列数从左到右从小到大排列。
【基本原理】
选取基准,产生左右标识,左右比基准,满足则换位,排完一次,基准定位,左右递归,直到有序
一、思路
选定基准值
将小于基准值的数放在左边
将大于基准值的数放在右边
分别对左右序列重复23操作
二、步骤
设定两个左右游标,取第一个数为基准值
将右侧游标数(第一个数)与基准值比较 ①大于基准值则 右游标-1 继续比较②小于基准值则将其放到左侧第一个位置
取左侧游标数与基准值比较①小于基准值 左游标+1 继续比较②大于基准值则将其放到右侧第一个位置
重复步骤23
动画示例:
三、实现代码
代码如下(示例):
private static int[] QuickSort(int[] array, int left, int right)
{
if (left >= right)//此时递归结束,排序完成
{
return array;
}
//取第一个数为基准值
//设定左右游标
int temp = array[left];
int templeft = left;
int tempright = right;
while (templeft != tempright)//两游标相等时停止
{
while (templeft < tempright && array[tempright] >= temp)//右游标值大于等于基准值则右游标值-1
{
tempright--;
}
array[templeft] = array[tempright];
while (templeft < tempright && array[templeft] <= temp)//左游标值小于等于基准值则左游标+1
{
templeft++;
}
array[tempright] = array[templeft];
}
array[templeft] = temp;//此时左右游标值相等,即将基准值放在最后的位置
//递归,分别对左右序列排序
QuickSort(array, left, tempright - 1);
QuickSort(array, templeft + 1, right);
return array;
}
注意:templeft < tempright 限定条件,当左游标小于右游标时进行
四、总结
由内向外的结构
第一层找到小于基准值的数放左边,大于基准值的数放右边
第二层(templeft和tempright不相等)时重复第一层,此时分为三部分,左侧小于基准值,右侧大于基准值
第三层运用递归分别对左右序列排序,直至left>=right