性能对比

LeetCode
快速排序
- 快速排序参数有三个,分别是源数组、左边界和右边界。采用的是闭区间写法。
可将整个排序算法细分成四部分:
- 边界判断:
if (lo >= hi) return。 partition:定位元素nums[lo]所在的位置。不断比较即可。- 对左半部分进行排序。
对右半部分进行排序。
class Solution {public int[] sortArray(int[] nums) {if (nums == null || nums.length == 0) return new int[0];int len = nums.length;quickSort(nums, 0, len - 1);return nums;}private void quickSort(int[] nums, int lo, int hi) {if (lo >= hi) return;// 定义两个指针,用于元素交换。// 这一步的目的就是确定 nums[l] 所在的位置// 遇到比int l = lo, cur = lo + 1;while (cur <= hi) {// 当前元素小于的时候才会被交换if (nums[cur] <= nums[lo]) {swap(nums, l + 1, cur);l++;}cur++;}// 位置 l 就是 lo 的确切地点了swap(nums, l, lo);quickSort(nums, lo, l - 1);quickSort(nums, l + 1, hi);}private void swap(int[] nums, int i, int j) {int temp = nums[i];nums[i] = nums[j];nums[j] = temp;}}
归并排序
class Solution {public int[] sortArray(int[] nums) {if (nums == null || nums.length == 0) return new int[0];int len = nums.length;int[] temp = new int[len];mergeSort(nums, 0, len - 1, temp);return nums;}private void mergeSort(int[] nums, int lo, int hi, int[] temp) {if (lo >= hi) return;int mid = lo + (hi - lo) / 2;mergeSort(nums, lo, mid, temp);mergeSort(nums, mid + 1, hi, temp);mergeTowSortedArray(nums, lo, mid, hi, temp);}private void mergeTowSortedArray(int[] nums, int lo, int mid, int hi, int[] temp) {System.arraycopy(nums, lo, temp, lo, hi - lo + 1);int i = lo, j = mid + 1;for (int k = lo; k <= hi; k++) {if (i > mid) nums[k] = temp[j++];else if (j > hi) nums[k] = temp[i++];else if (temp[i] > temp[j]) nums[k] = temp[j++];else nums[k] = temp[i++];}}}
- 边界判断:
