100 | 12 | 14 | 17 | 64 | 53 | 1335 | 277 | 27 | 2727 |
| | | |
有两个指针,指向数组的最左和最右,拿出一个变量叫做 key记录最左侧的元素大小
现在开始遍历,右边指针向左移动,找到小于key的地方停下来,左边指针向右移动,找到大于key的元素停下来,然后左右交换元素,继续前进,直到两个指针重合,然后重合处和key交换。这就完成了一趟排序,key值被放在了他自己应该在的位置,左边的都比他小,右边的都比他大。
来看一下java代码实现
public static void main(String[] args) {
int[] nums = {12,15,31,24,14,11,41,351,5,26,3,29,36,1,6,13346,513,5133};
quicksort(nums, 0, nums.length-1);
for (int num : nums) {
System.out.print(num+" ");
}
}
public static void quicksort(int[] nums,int left,int right){
//如果左指针大于右指针,说明本趟排序完了,直接返回
if (left > right){
return;
}
int l = left;
int r = right;
int key = nums[left];
while (l != r){
//右边大于key,一直左移不要停
while (nums[r] >= key && l < r){
r -= 1;
}
//左边小于key,一直右移不要停
while(nums[l] <= key && l < r){
l += 1;
}
//如果两个指针移动完了,但是没重合,那就交换两个元素
if (l < r){
int temp = nums[r];
nums[r] = nums[l];
nums[l] = temp;
}
}
//如果移动完,两个指针重合了,说明找到了该元素的位置,
// 与最左侧的元素交换(也就是key拿的那个元素)
nums[left] = nums[l];
nums[l] = key;
//递归遍历小于key的那部分
quicksort(nums, left, l-1);
//递归遍历大于key的那部分
quicksort(nums, l+1, right);
}