目录
原理
分治、递归,找到基准值,小于基准值放在左边(左区间),大于基准值放在右边(右区间),在分别递归左右区间,当每个区间只有一个值时,排序完成。
思路
1.设数组为array,首先获取基准值,一般情况下取第一位,设为key
2.设置两个参数leftIndex ,rightIndex
3.从右到左开始,如果array[rightIndex] > key,rightIndex --,即从右到左找到第一个小于基准值的数,
然后设置array[leftIndex] = array[rightIndex],leftIndex + +,此时array[rightIndex]位置的数据不变,但是为了直观、方便 理解,我们可以把它想象为空。
4.从左到右开始,如果array[leftIndex] < key,leftIndex ++,即从左到右找到第一个大于基准值的数,然后设置为array[rightIndex] = array[leftIndex],rightIndex --,此时我们上一步想象数据为空的位置被放置第一个大于基准值的数(从左到右),此时我们又把array[leftIndex]位置的数据想象为空。
5.依次3,4步操作,直到不满足leftIndex < rightIndex,此时设置array[leftIndex] = key,基准值左右形成两个区间。
6.分别递归基准值左右区间,直至每个区间长度只有1,排序完成
图解
代码
public void quickSort(int[] array, int start, int end) {
if (start < end) {
int key = array[start];
int leftIndex = start;
int rightIndex = end;
while (leftIndex < rightIndex) {
//从右往左找到比基准值小的数
while (leftIndex < rightIndex && array[rightIndex] > key) {
rightIndex--;
}
if (leftIndex < rightIndex) {
array[leftIndex] = array[rightIndex];
leftIndex++;
}
//从左到右找到比基准值大的数
while (leftIndex < rightIndex && array[leftIndex] < key) {
leftIndex++;
}
if (leftIndex < rightIndex) {
array[rightIndex] = array[leftIndex];
rightIndex--;
}
}
array[leftIndex] = key;
quickSort(array, start, leftIndex -1);
quickSort(array, leftIndex + 1, end);
}
}