将待排序元素取出来,定义两个数字,分别指向序列的首尾;从后往前找小于待排序元素的元素,将它放到首数字指针指向的位置,首指针往后移一位;再从前往后找大于待排序元素的元素,将它放到尾数字指针指向的位置,尾指针向前移一位;如此反复,知道首尾指针相等,则此位置就是待排序元素的最终位置,它的左边都小于等于它自己;它的右边都是大于等于它自己的元素。
再次用上述相同的方法处理左右两个序列,则最终可得到有序的序列。
快速排序的方法就是将比待排元素大的放在它的右边,小的放左边,以此类推,则最终该序列就是有序序列。
void kuaipai(int[] nums, int low, int high) {
int begin = low, end = high; //定义两个指向下标收尾的数字
int temp = nums[begin]; //将第一个元素拿出来,定为待排序元素
while (begin < end) { //遍历整个序列
while (begin < end && nums[end] > temp) { //从后往前寻找序列中小于待排序元素的元素,若没有,则end减1
end --;
}
if (begin < end) { //若结束上边循环的条件是nums[end] <= temp,即找到了比待排序元素小的元素
nums[begin] = nums[end]; //则将找到的元素放到begin指向的位置
begin ++; //begin向后移一位
}
while (begin < end && nums[begin] < temp) { //从前往后寻找序列中大于待排序元素的元素,若没有,则begin加1
begin ++;
}
if (begin < end) { //若结束上边循环的条件是nums[begin] >= temp,即找到了比待排序元素大的元素
nums[end] = nums[begin]; //则将找到的元素放到end指向的位置
end --; //end减1
}
}
nums[begin] = temp; //循环遍历完后,即begin=end时,则待排序元素位置即为begin和end指向的元素序列位置
if (low < begin) { //上边的待排序元素将序列分为左边小于待排序元素,右边大于待排序元素,则low到begin-1为小于temp的序列
kuaipai(nums, low, begin - 1);
}
if (high > end) { //high+1到end为大于temp的序列,调用递归
kuaipai(nums, end + 1, high);
}
}