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     }

 

posted @ 2022-05-22 12:03  yzmarcus  阅读(41)  评论(0编辑  收藏  举报