题目
题目来源:力扣(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.lengthconst heapify = function (index) {const left = index * 2 + 1const right = index * 2 + 2let largest = indexif (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.lengthconst temp = []const merge = function (left, mid, right) {let p1 = left, p2 = mid + 1temp.length = 0while (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) returnif (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}
