闲着无聊重新过了一下排序算法,冲!
选择排序
选择排序是最直观的排序方法之一,我们只需要选择出最小的,让后把它放到最前面即可。不过问题也很明显,便是他不够快。
时间复杂度为 O(n2)
function selectionSort(nums) {
for (let i = 0; i < nums.length; i++) {
let min = i;
for (let j = i; j < nums.length; j++) {
if (nums[j] < nums[min]) {
min = j;
}
}
[nums[i], nums[min]] = [nums[min], nums[i]];
}
return nums;
}
插入排序
插入排序的时间复杂度是也是 O(n2),不过在输入的数组是已经排列好的情况下,它只用进行一次遍历即可,所以最优时间复杂度为 O(n)
function insertionSort(nums) {
for (let i = 0; i < nums.length; i++) {
for (let j = i; j < nums.length && nums[j-1] > nums[j]; j--) {
[nums[j], nums[j-1]] = [nums[j-1], nums[j]];
}
}
return nums;
}
快速排序
快排是通过类似二分查找的方法实现的排序,会需要我们先确定一个枢纽值,然后分治大于和小于该值的部分。
快排的效率会优于上面两种排序方法,它的时间复杂度为 O(log(n))。
function quickSort(nums) {
if (nums.length < 2) {
return nums;
}
let pivot = nums[0];
let lower = [],
higher = [];
for (let i = 1; i < nums.length; i++) {
if (nums[i] > pivot) {
higher.push(nums[i]);
} else {
lower.push(nums[i]);
}
}
return quickSort(lower).concat(pivot, quickSort(higher));
}
其实也可以通过两行直接写出来:
function quickSort(nums) {
if (nums.length < 2) return nums;
return quickSort(nums.slice(1).filter(el => el <= nums[0])).concat(nums[0], quickSort(nums.slice(1).filter(el => el > nums[0])));
}
总结一下
-
小伙伴们一起来用 JavaScript 刷算法吧:LeetCode-JavaScript
-
本文正在参与「掘金 2021 春招闯关活动」, 点击查看 活动详情