1.快排 java
用less more划分大于区 小于区 等于区,采用随机取数,时间复杂度
class Solution {
public int[] sortArray(int[] nums) {
if (nums.length <= 1 ) {
return nums;
}
quickSort(nums, 0, nums.length - 1);
return nums;
}
private static void quickSort(int[] nums, int left, int right) {
if (left >= right) {
return;
}
swap(nums, left + (int) Math.random() * (right - left + 1), right);
int[] p = partition(nums, left, right);
quickSort(nums, left, p[0] - 1);
quickSort(nums, p[1] + 1, right);
}
private static int[] partition(int[] nums, int left, int right) {
int less = left - 1;
int more = right;
while (left < more) {
if (nums[left] > nums[right]) {
swap(nums, left, --more);
} else if (nums[left] < nums[right]) {
swap(nums, left++, ++less);
} else {
left++;
}
}
swap(nums, more, right);
return new int[] {less + 1, more};
}
private static void swap(int[] nums, int i, int j) {
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}
}
2.归并排序 master 公式
class Solution {
public int[] sortArray(int[] nums) {
if (nums.length <= 1) return nums;
sortByHalf(nums, 0, nums.length - 1);
return nums;
}
private void sortByHalf(int[] nums, int left, int right) {
if (left >= right) {
return;
}
int mid = left + (right - left) / 2;
sortByHalf(nums, left, mid);
sortByHalf(nums, mid + 1, right);
merge(nums, left, mid, right);
}
private void merge(int[] nums, int left, int mid, int right) {
int[] tmpArray = new int[right - left + 1];
int i = left;
int j = mid + 1;
int k = 0;
while(i <= mid && j <= right) {
if (nums[i] < nums[j]) {
tmpArray[k++] = nums[i++];
} else {
tmpArray[k++] = nums[j++];
}
}
while (i <= mid) {
tmpArray[k++] = nums[i++];
}
while (j <= right) {
tmpArray[k++] = nums[j++];
}
for(i = 0; i < tmpArray.length; i++) {
nums[i + left] = tmpArray[i];
}
}
}