大厂算法面试之leetcode精讲14.排序算法

大厂算法面试之leetcode精讲14.排序算法

视频讲解(高效学习):点击学习
目录:

1.开篇介绍

2.时间空间复杂度

3.动态规划

4.贪心

5.二分查找

6.深度优先&广度优先

7.双指针

8.滑动窗口

9.位运算

10.递归&分治

11剪枝&回溯

12.堆

13.单调栈

14.排序算法

15.链表

16.set&map

17.栈

18.队列

19.数组

20.字符串

21.树

22.字典树

23.并查集

24.其他类型题

常见排序算法复杂度

d s

n^2除nlogn在不同数据规模下的结果

ds_114

常见排序算法

算法可视化来源:http://visualgo.net/

冒泡排序:时间复杂度O(n^2)

  • 比较相邻元素,如果第一个比第二个大,则交换他们
  • 一轮下来,可以保证最后一个数是最大的
  • 执行n-1轮,就可以完成排序

ds_192

function bubbleSort(arr) {
   
    var len = arr.length;
    for (var i = 0; i < len; i++) {
   
        for (var j = 0; j < len - 1 - i; j++) {
   
            if (arr[j] > arr[j+1]) {
           //相邻元素两两对比
                var temp = arr[j+1];        //元素交换
                arr[j+1] = arr[j];
                arr[j] = temp;
            }
        }
    }
    return arr;
}

选择排序:时间复杂度O(n^2)

  • 找到数组中的最小值,将它放在第一位
  • 接着找到第二小的值,将它放在第二位
  • 依次类推,执行n-1轮

ds_193

function selectionSort(arr) {
   
    var len = arr.length;
    var minIndex, temp;
    for (var i = 0; i < len - 1; i++) {
   
        minIndex = i;
        for (var j = i + 1; j < len; j++) {
   
            if (arr[j] < arr[minIndex]) {
        //寻找最小的数
                minIndex = j;                 //将最小数的索引保存
            }
        }
        temp = arr[i];
        arr[i] = arr[minIndex];
        arr[minIndex] = temp;
    }
    return arr;
}

插入排序:时间复杂度O(n^2)

  • 从第二个数开始往前比
  • 比它大就往后排
  • 以此类推直到最后一个数

ds_194

function insertionSort(arr) {
   
    var len = arr.length;
    var preIndex, current;
    for (var i = 1; i < len; i++) {
   
        preIndex = i - 1;
        current = arr[i];
        while(preIndex >= 0 && arr[preIndex] > current) {
   
            arr[preIndex+1] = arr[preIndex];
            preIndex--;
        }
        arr[preIndex+1] = current;
    }
    return arr;
}

归并排序:时间复杂度O(nlogn),分的时间复杂度O(logn),合并的过程的复杂度是O(n)

  • 分:把数组分成两半,递归子数组,进行分割操作,直到分成一个数

  • 合:把两个字数组合并成一个有序数组,直到全部子数组合并完毕,合并前先准备一个空数组,存放合并之后的结果,然后不断取出两个子数组的第一个元素,比较他们的大小,小的先进入之前准备的空数组中,然后继续遍历其他元素,直到子数组中的元素都完成遍历

ds_195

function mergeSort(arr) {
     //采用自上而下的递归方法
    var len = arr.length;
    if(len < 2) {
   
        return arr;
    }
    var middle = Math.floor(len / 2),
        left = arr.slice(0, middle),
        right = arr.slice(middle);
    return merge(mergeSort(left), mergeSort(right));
}

function merge(left, right)
{
   
    var result = [];

    while (left.length && right.length) {
   
        if (left[0] <= right[0]) {
   
            result.push(left.shift());
        } else {
   
            result.push(right.shift());
        }
    }

    while (left.length)
        result.push(left.shift());

    while (right.length)
        result.push(right.shift());

    return result;
}

快速排序:时间复杂度O(nlogn),递归复杂度是O(logn),分区复杂度O(n)

  • 分区:从数组中选一个基准值,比基准值小的放在它的前面,比基准值大的放在它的后面
  • 递归:递归对基准值前后的子数组进行第一步的操作

ds_196

function quickSort(arr, left, right) {
   
    var len = arr.length,
        partitionIndex,
        left = typeof left != 'number' ? 0 : left,
        right = typeof right != 'number' ? len - 1 : right;

    if (left < right) {
   
        partitionIndex = partition(arr, left, right);
        quickSort(arr, left, partitionIndex-1);
        quickSort(arr, partitionIndex+1, right);
    }
    return arr;
}

function partition(arr, left ,right) {
        //分区操作
  	//设定基准值位置(pivot)当然也可以选择最右边的元素为基准 也可以随机选择然后和最左或最右元素交换
    var pivot = left,                      
        index = pivot + 1;
    for (var i = index; i <= right; i++) {
   
        if (arr[i] < arr[pivot]) {
   
            swap(arr, i, index);
            index++;
        }        
   
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值