算法初级02——荷兰国旗问题、随机快速排序、堆排序、桶排序、相邻两数的最大差值问题、工程中的综合排序算法

 主要讨论:荷兰国旗问题、随机快速排序、堆排序、稳定性、比较器、桶排序、相邻两数的最大差值问题和简单介绍工程中的综合排序算法

 

题目一

给定一个数组arr,和一个数num,请把小于等于num的数放在数组的左边,大于num的数放在数组的右边。

要求额外空间复杂度O(1),时间复杂度O(N)

参考下面的代码即可


问题二(荷兰国旗问题)

给定一个数组arr,和一个数num,请把小于num的数放在数组的左边,等于num的数放在数组的中间,大于num的数放在数组的右边。

要求额外空间复杂度O(1),时间复杂度O(N)

复制代码
    public static int[] partition(int[] arr, int l, int r, int p) {         int less = l - 1;         int more = r + 1;         while (l < more) {             if (arr[l] < p) {                 swap(arr, ++less, l++);             } else if (arr[l] > p) {                 swap(arr, --more, l);             } else {                 l++;             }         }         return new int[] { less + 1, more - 1 };     }      // for test    public static void swap(int[] arr, int i, int j) {         int tmp = arr[i];         arr[i] = arr[j];         arr[j] = tmp;     }
复制代码

 

题目二

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

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

时间复杂度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(
                        
关键字:
50000+
5万行代码练就真实本领
17年
创办于2008年老牌培训机构
1000+
合作企业
98%
就业率

联系我们

电话咨询

0532-85025005

扫码添加微信