1 左右哨兵等于pivot的情况要接着走,不然有可能一直不动,无限循环 2 需要先走右指针再走左指针,因为pivot在最左侧,最终停留点应该比pivot小,这样交换后小的在前; 如果左侧先走,最终停留点比pivot大 3 迭代下一轮循环的时候,不要包括相遇点,因为这个点前面都比它大,后面都比它小,不能再作为基准点; 如果迭代包括了相遇点,会造成无限循环
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); }
标签:right,input,int,注意,meet,pivot,排序,快速,left From: https://www.cnblogs.com/yanher/p/16885307.html