基础算法解析

Posted joe-and-joan

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基础算法解析相关的知识,希望对你有一定的参考价值。

1. 五大算法
  • 贪心算法: 局部最优解法
  • 分治算法: 分成多个小模块,与原问题性质相同
  • 动态规划: 每个状态都是过去历史的一个总结
  • 回溯法: 发现原先选择不优时,退回重新选择
  • 分支限界法
2. 基础排序算法
技术图片
  • 口诀: 插冒归基稳定,快选堆希不稳定
 
1、冒泡排序:两两比较
function bubleSort(arr) {
        var len = arr.length;
        for (let i=0 ; i<len-1; i++) {
            for(let j = 0; j <=len- i - 1; j++) {
                if(arr[j] > arr[j + 1]) {
                    [arr[j],arr[j+1]] = [arr[j+1],arr[j]]
                }
            }
        }
        return arr;
    }
技术图片
2、选择排序: 遍历自身以后的元素,最小的元素跟自己调换位置
function selectSort(arr) {
    var len = arr.length;
    for(let i = 0 ;i < len - 1; i++) {
        for(let j = i ; j<len; j++) {
            if(arr[j] < arr[i]) {
                [arr[i],arr[j]] = [arr[j],arr[i]];
            }
        }
    }
    return arr
}
 
3、插入排序: 将元素插入到已排序好的数组中
function insertSort(arr) {
    for(let i = 1; i < arr.length; i++) {  //外循环从1开始,默认arr[0]是有序段
        for(let j = i; j > 0; j--) {  //j = i,将arr[j]依次插入有序段中
            if(arr[j] < arr[j-1]) {
                [arr[j],arr[j-1]] = [arr[j-1],arr[j]];
            } else {
                break;
            }
        }
    }
    return arr;
}

技术图片

4、快速排序(高级)
  • 选择基准值(base),原数组长度减一(基准值),使用 splice,也可选择中间值方便理解
  • 循环原数组,小的放左边(left数组),大的放右边(right数组);
  • concat(left, base, right)
  • 递归继续排序 left 与 right
    function quickSort(arr) {
        if(arr.length <= 1) {
            return arr;  //递归出口
        }
        var left = [],
            right = [],
            current = arr.splice(0,1); 
        for(let i = 0; i < arr.length; i++) {
            if(arr[i] < current) {
                left.push(arr[i])  //放在左边
            } else {
                right.push(arr[i]) //放在右边
            }
        }
        return quickSort(left).concat(current,quickSort(right));
    }
一行代码实现快排(filter):
function quickSort(a) {
  return a.length <= 1 ? a : quickSort(a.slice(1).filter(item => item <= a[0])).concat(a[0], quickSort(a.slice(1).filter(item => item > a[0])));
}
//slice是返回start-end选定的子数组,不修改原数组
5、希尔排序(高级):不定步数的插入排序
function shellSort(arr) {
  for(let gap = Math.floor(arr.length/2); gap > 0; gap = Math.floor(gap/2)) {
    // 内层循环与插入排序的写法基本一致,只是每次移动的步长变为 gap,而不是 1:
    for(let i = gap; i < arr.length; i++) {
      let j = i;
      let temp = arr[j];
      for(; j> 0; j -= gap) {
        if(temp >= arr[j-gap]) {
          break;
        }
        arr[j] = arr[j-gap];
      }
      arr[j] = temp;
    }
  }
  return arr;
}
 技术图片

 

以上是关于基础算法解析的主要内容,如果未能解决你的问题,请参考以下文章

三大基础排序算法(冒泡排序,选择排序,插入排序)

编程思想与算法

常用编程思想与算法

视频二次裁剪时间计算出原片的时间片段算法

视频二次裁剪时间计算出原片的时间片段算法

以下代码片段的算法复杂度