性能对比

排序算法性能对比.png

LeetCode

912. 排序数组

快速排序

  1. 快速排序参数有三个,分别是源数组、左边界和右边界。采用的是闭区间写法。
  2. 可将整个排序算法细分成四部分:

    1. 边界判断:if (lo >= hi) return
    2. partition:定位元素 nums[lo] 所在的位置。不断比较即可。
    3. 对左半部分进行排序。
    4. 对右半部分进行排序。

      1. class Solution {
      2. public int[] sortArray(int[] nums) {
      3. if (nums == null || nums.length == 0) return new int[0];
      4. int len = nums.length;
      5. quickSort(nums, 0, len - 1);
      6. return nums;
      7. }
      8. private void quickSort(int[] nums, int lo, int hi) {
      9. if (lo >= hi) return;
      10. // 定义两个指针,用于元素交换。
      11. // 这一步的目的就是确定 nums[l] 所在的位置
      12. // 遇到比
      13. int l = lo, cur = lo + 1;
      14. while (cur <= hi) {
      15. // 当前元素小于的时候才会被交换
      16. if (nums[cur] <= nums[lo]) {
      17. swap(nums, l + 1, cur);
      18. l++;
      19. }
      20. cur++;
      21. }
      22. // 位置 l 就是 lo 的确切地点了
      23. swap(nums, l, lo);
      24. quickSort(nums, lo, l - 1);
      25. quickSort(nums, l + 1, hi);
      26. }
      27. private void swap(int[] nums, int i, int j) {
      28. int temp = nums[i];
      29. nums[i] = nums[j];
      30. nums[j] = temp;
      31. }
      32. }

      归并排序

      1. class Solution {
      2. public int[] sortArray(int[] nums) {
      3. if (nums == null || nums.length == 0) return new int[0];
      4. int len = nums.length;
      5. int[] temp = new int[len];
      6. mergeSort(nums, 0, len - 1, temp);
      7. return nums;
      8. }
      9. private void mergeSort(int[] nums, int lo, int hi, int[] temp) {
      10. if (lo >= hi) return;
      11. int mid = lo + (hi - lo) / 2;
      12. mergeSort(nums, lo, mid, temp);
      13. mergeSort(nums, mid + 1, hi, temp);
      14. mergeTowSortedArray(nums, lo, mid, hi, temp);
      15. }
      16. private void mergeTowSortedArray(int[] nums, int lo, int mid, int hi, int[] temp) {
      17. System.arraycopy(nums, lo, temp, lo, hi - lo + 1);
      18. int i = lo, j = mid + 1;
      19. for (int k = lo; k <= hi; k++) {
      20. if (i > mid) nums[k] = temp[j++];
      21. else if (j > hi) nums[k] = temp[i++];
      22. else if (temp[i] > temp[j]) nums[k] = temp[j++];
      23. else nums[k] = temp[i++];
      24. }
      25. }
      26. }