荷兰国旗问题来改进快速排序------排序4

随机快速排序的细节和复杂度分析

可以用荷兰国旗问题来改进快速排序

时间复杂度O(N*logN),额外空间复杂度O(logN)

具体代码如下:

public static void quickSort(int[] arr) {
   if (arr == null || arr.length < 2) {
      return;
   }
   quickSort(arr, 0, arr.length - 1);
}

public static void quickSort(int[] arr, int l, int r) {
   if (l < r) {
      swap(arr, l + (int) (Math.random() * (r - l + 1)), r);
      int[] p = partition(arr, l, r);
      quickSort(arr, l, p[0] - 1);
      quickSort(arr, p[1] + 1, r);
   }
}

public static int[] partition(int[] arr, int l, int r) {
   int less = l - 1;
   int more = r;
   while (l < more) {
      if (arr[l] < arr[r]) {
         swap(arr, ++less, l++);
      } else if (arr[l] > arr[r]) {
         swap(arr, --more, l);
      } else {
         l++;
      }
   }
   swap(arr, more, r);
   return new int[] { less + 1, more };
}

public static void swap(int[] arr, int i, int j) {
   int tmp = arr[i];
   arr[i] = arr[j];
   arr[j] = tmp;
}

加粗部分的解释 

荷兰国旗问题来改进快速排序------排序4

最坏的时间复杂度:

荷兰国旗问题来改进快速排序------排序4

最好的时间复杂度:

荷兰国旗问题来改进快速排序------排序4

空间复杂度

荷兰国旗问题来改进快速排序------排序4