14.5:真正意义上的快排3.0:随机快排O(N * logN)
14.5:真正意义上的快排:随机快排
[ ....?... X] 随机从数组中选一个数和最右侧的数进行交换,
[ ....X... ?] 拿这个?数作为目标数
将数组划分成:
[ <? ==? >? ?]
只需要将最后?和>?区域的第一数交换,?就来到了==?区域
[ <? ==? ? >? ] 此时==?的位置固定下来,不用变了。
通过递归:
处理[ <? ]区域
处理[ >? ]区域
1 public static void quickSort3(int[] arr) { 2 if (arr == null || arr.length < 2) { 3 return; 4 } 5 process3(arr, 0, arr.length - 1); 6 } 7 8 public static void process3(int[] arr, int L, int R) { 9 if (L >= R) { 10 return; 11 } 12 swap(arr, L + (int) (Math.random() * (R - L + 1)), R); 13 int[] equalArea = netherlandsFlag(arr, L, R); 14 process3(arr, L, equalArea[0] - 1); 15 process3(arr, equalArea[1] + 1, R); 16 }