快速排序需要注意的问题
1 左右哨兵等于pivot的情况要接着走,不然有可能一直不动,无限循环
2 需要先走右指针再走左指针,因为pivot在最左侧,最终停留点应该比pivot小,这样交换后小的在前;
如果左侧先走,最终停留点比pivot大
3 迭代下一轮循环的时候,不要包括相遇点,因为这个点前面都比它大,后面都比它小,不能再作为基准点;
如果迭代包括了相遇点,会造成无限循环
4. 左右指针分别移动的时候,满足条件 left< right , 不能有相等的情况。不然右指针移动到左指针相同位置,左指针还要继续走,导致反向交换元素
5. while循环, 在左右指针相等的时候要退出。 不然会一直循环下去。
private void quickSort(int[] input, int left, int right) {
//越界
if (left >= input.length || right < 0) {
return;
}
//相遇错过
if (left >= right) {
return;
}
int meet = left;
int baseVal = input[left];
int head = left;
int tail = right;
while (true) {
//这里等于的情况需要往前走,不然有可能一直不动,无限循环
//这里需要先走右指针再走左指针,因为pivot在最左侧,最终停留点应该比pivot小,
//如果左侧先走,最终停留点比pivot大,这时候交换pivot和停留点就把大的放到pivot前面了
while (input[right] >= baseVal && left<right) {
right--;
}
while (input[left] <= baseVal && left<right) {
left++;
}
if (left >= right) {
meet = right;
break;
}
swap(input, left, right);
}
swap(input, head, meet);
//排序前半(较小)部分
//这里跳过meet位置,因为meet位置前的都比它小
quickSort(input, head, meet - 1);
//排序后半(较大)部分
//这里跳过meet位置,因为meet位置后的都比它大
quickSort(input, meet+1, tail);
}
浙公网安备 33010602011771号