-
选出一个 key,一般是最左边或是最右边的指。
-
定义一个 L 指向最左边的位置,定义一个 R 指向最右边的位置,L 从左向右走,R 从右向左走。(需要注意的是:若选择最左边的数据作为 key,则需要 R 先走;若选择最右边的数据作为 key,则需要 L 先走)。
-
我们以选取最左边的值作为 key 为例子,那么 R 先走,在走的过程中,若 R 遇到小于 key 的数,则停下,L 开始走,直到 L 遇到一个大于 key 的数时,将 L 和 R 的内容交换,R 再次开始走,如此进行下去,直到 L 和 R 最终相遇,此时将相遇点的内容与 key 交换即可。
-
经过一次单趟排序,最终使得 key 左边的数据全部都小于 key,key 右边的数据全部都大于 key。
这个方法的精华在于:单趟排完以后,key 已经放在正确的位置,那么左边有序,右边有序,那么我们整体就有序了
动画演示
代码演示
public static void main(String[] args) {
int[] arr = {10, 9, 8, 7, 6, 5, 4, 3, 2, 1};
// 在main方法中直接编写
for (int i = 0; i < arr.length/2; i++) {
int key = i;
int left = 0;
int right = arr.length-1;
while (left < right) {
//右边找比key小的值
while (left < right && arr[right] >= arr[key]) {
right--;
}
//左边找比key大的值
while (arr[left] <= arr[key] && left<right) {
left++;
}
int temp = arr[left];
arr[left] = arr[right];
arr[right] = temp;
}
int tem = arr[left];
arr[left] = arr[key];
arr[key] = tem;
}
System.out.println(Arrays.toString(arr));
}
// 通过方法递归调用实现快速排序
public static void sort(int[] arr,int start,int end){
if (start >= end){
return;
}
int left = start;
int right = end;
int key = arr[left];
while (left<right)
{
while (left<right && arr[right]<key){
right--;
}
while (left<right && arr[left]>key){
left++;
}
int temp = arr[left];
arr[left] = arr[right];
arr[right] = temp;
}
key = arr[left];
arr[left] = key;
sort(arr, start,left-1);
sort(arr, left+1, end);
}