题目
题目来源:力扣(LeetCode)
给你一个整数数组 nums,请你将该数组升序排列。
示例 1:
输入:nums = [5,2,3,1]
输出:[1,2,3,5]
示例 2:
输入:nums = [5,1,1,2,0,0]
输出:[0,0,1,1,2,5]
方法一:快速排序
快速排序的主要思想是通过划分将待排序的序列分成前后两部分,其中前一部分的数据都比后一部分的数据要小,然后再递归调用函数对两部分的序列分别进行快速排序,以此使整个序列达到有序。
/**
* @param {number[]} nums
* @return {number[]}
*/
var sortArray = function(nums) {
quickSort(nums, 0, nums.length - 1);
return nums
};
const quickSort = (arr, left, right) => {
// 只剩一个元素时,不用再进行排序
if (left > right) return;
let i = left, j = right;
// 基准值
const pivot = arr[i];
while (i < j) {
// 从右向左找到小的
while (i < j && arr[j] >= pivot) {
j--;
}
arr[i] = arr[j];
// 从左向右找到大的
while (i < j && arr[i] <= pivot) {
i++
}
arr[j] = arr[i];
}
arr[i] = pivot;
quickSort(arr, left, i - 1);
quickSort(arr, i + 1, right);
}
方法二:堆排序
堆排序的思想就是先将待排序的序列建成大根堆,使得每个父节点的元素大于等于它的子节点。此时整个序列最大值即为堆顶元素,我们将其与末尾元素交换,使末尾元素为最大值,然后再调整堆顶元素使得剩下的 n-1 个元素仍为大根堆,再重复执行以上操作我们即能得到一个有序的序列。
/**
* @param {number[]} nums
* @return {number[]}
*/
var sortArray = function (nums) {
let len = nums.length
const heapify = function (index) {
const left = index * 2 + 1
const right = index * 2 + 2
let largest = index
if (left < len && nums[left] > nums[largest]) {
largest = left
}
if (right < len && nums[right] > nums[largest]) {
largest = right
}
if (largest !== index) {
swap(nums, index, largest)
heapify(largest)
}
}
const buildMaxHeap = function () {
for (let i = len >> 1; i >= 0; i--) {
heapify(i)
}
}
buildMaxHeap()
for (let i = len - 1; i >= 0; i--) {
swap(nums, i, 0)
len--
heapify(0)
}
return nums
}
const swap = function (arr, i, j) {
const temp = arr[i]
arr[i] = arr[j]
arr[j] = temp
}
方法三:归并排序
归并排序利用了分治的思想来对序列进行排序。对一个长为 n 的待排序的序列,我们将其分解成两个长度为
n/2 的子序列。每次先递归调用函数使两个子序列有序,然后我们再线性合并两个有序的子序列使整个序列有序。
/**
* @param {number[]} nums
* @return {number[]}
*/
var sortArray = function (nums) {
let len = nums.length
const temp = []
const merge = function (left, mid, right) {
let p1 = left, p2 = mid + 1
temp.length = 0
while (p1 <= mid && p2 <= right) {
temp.push(nums[p1] < nums[p2] ? nums[p1++] : nums[p2++])
}
while (p1 <= mid) {
temp.push(nums[p1++])
}
while (p2 <= right) {
temp.push(nums[p2++])
}
for (let i = left; i <= right; i++) {
nums[i] = temp[i - left]
}
}
const sort = function (left, right) {
if (left >= right) return
if (right - left === 1) {
if (nums[left] > nums[right]) {
swap(nums, left, right)
}
return
}
const mid = left + ((right - left) >> 1)
sort(left, mid)
sort(mid + 1, right)
merge(left, mid, right)
}
sort(0, nums.length - 1)
return nums
};
const swap = function (arr, i, j) {
const temp = arr[i]
arr[i] = arr[j]
arr[j] = temp
}