算法通关手册(十) 排序算法 模板 + 题目 + 题解

295 阅读1分钟

常用、常考的排序算法大概有以下几种:

  • O(N)
    • 冒泡排序
    • 插入排序
    • 选择排序
  • O(Nlon(N))
    • 快速排序
    • 堆排序
    • 归并排序
  • O(N+M)
    • 计数排序

可以使用模板题进行训练:

1. 快速排序

模板

function quickSort(nums, l, r) {
    if (l >= r) return;
    const p = sort(nums, l, r);
    quickSort(nums, l, p);
    quickSort(nums, p + 1, r);
}

function sort(nums, l, r) {
    const mv = nums[(l + r) >> 1];
    
    while (l <= r) {
        while (nums[l] < mv) l++;
        while (nums[r] > mv) r--;
        if (l === r) break;
        if (l < r) {
            [nums[l], nums[r]] = [nums[r], nums[l]];
            l ++;
            r --;
        }
    }
    
    return r;
}

题目

2. 计数排序

概述

计数排序要求输入的数据必须是有确定范围的整数。将输入的数据作为key存储在额外的数组中,然后依次把计数大于1的填充回原数组

  • 时间复杂度 O(N + M), N 为元素个数, M 为数值范围

题目

3. 归并排序

模板


function mergeSort(nums, l, r) {
    if (l >= r) return;
    const mid = (l + r) >> 1;
    
    mergeSort(nums, l, mid);
    mergeSort(nums, mid + 1, r);
    merge(nums, l, mid, r);
}


function merge(nums, l, mid, r) {
    let lp = l;
    let rp = mid + 1;
    
    const temp = new Array(r - l + 1).fill(0);
    
    for (let i = 0; i < temp.length; i++) {
        if (rp > r || (lp <= mid && nums[lp] <= nums[rp])) {
            temp[i] = nums[lp++];
        } else {
            temp[i] = nums[rp++];
        }
    }
    
    for (let i = 0; i < temp.length; i++) {
        nums[l + i] = temp[i]
    }
}

题目

4. 其他题目

题目