快速排序需要注意的问题

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); }

  

posted @ 2022-11-13 02:34  yanher  阅读(99)  评论(0)    收藏  举报