算法学习笔记:排序算法(一)

算法对大多数前端工程师来讲都是一个比较不肯意说起的话题,由于学了,感受在工做中直接应用的场景很少,不学,大厂面试必考算法,总结来讲就是:没有学习算法的源动力,为面试学习算法总不会使人动力去学习,没有动力想要学好算法天然也很难,对我来讲,学习算法的动力就是但愿写出更高效率的代码,更好的理解各类前端框架的设计思路,所以,后面会写几篇有关算法的学习笔记,下面进入这篇文章正题:排序算法前端

冒泡排序

排序算法中最简单最基础的就是冒泡排序,这种排序的思想就是相邻两个元素进行两两比较,大的放后面,每一轮选出最大的元素,让咱们来看具体代码:面试

function bubbleSort(arr) {
  for (var i = 0; i < arr.length - 1; i++) {
    for (var j = 0; j < arr.length - i - 1; j++) {
      var temp;
      if (arr[j] > arr[j + 1]) { // 相邻两个元素比较,大的日后移动
        temp = arr[j]
        arr[j] = arr[j+1]
        arr[j+1] = temp
      }
    }
  }
  console.log(arr)
}
bubbleSort([3,44,38,5,47,15,36,26,27,2,46,4,19,50,48])

为了更好的看到排序的过程,让咱们来看下面动态图片:
图片描述算法

冒泡排序,在数组自己就是有序的状况下(最好状况),须要须要n-1次比较能完成,可是在最坏的状况下须要比较和交换n-1+n-2+n-3+...+1=n(n-1)/2次,其算法复杂度为O(n^2)数组

选择排序

选择排序是最直观简单的一种排序算法,具体实现思路就是:把第一个元素假定为最小元素,遍历后面没有排序的元素,若是发现比当最小元素小的值,就记下数组下标,循环执行,当一轮循环结束,将最小下标对应的值和当前元素调换位置,来看具体代码实现:前端框架

function selectionSort(arr) {
  var index,temp // index:最小值下标索引,temp:临时变量
  for (var i = 0; i < arr.length; i++) {
    index = i
    for (var j = i + 1; j < arr.length; j++) {
      if (arr[j] < arr[index]) {
        index = j
      }
    }
    temp = arr[i]
    arr[i] = arr[index]
    arr[index] = temp
  }
  console.log(arr)
}
selectionSort([3,44,38,5,47,15,36,26,27,2,46,4,19,50,48])

为了更直观的展现排序的过程,让咱们来看动态图片展现:
图片描述前端工程师

对于选择排序来讲,比较次数是固定的,而交换次数则和数组的是否有序有关,但数组是正序时,不须要交换,当数组是倒序时,须要交换n-1次,它的时间复杂度是O(n^2)框架

插入排序

插入排序的实现思路和选择排序的实现思路有点相似,先将第一个元素设为已排序,而后遍历剩余的元素,若是已排序的元素大于当前的提取元素,已排序的元素向右移动一位,不然就将当前提取的元素插入,来看具体的代码实现:学习

function insetSort(arr) {
  for (var i = 0; i < arr.length; i++) {
    var temp = arr[i] // 提取出来的元素
    var j = i - 1
    while (arr[j] > temp) { // 比较已排序元素和当前提取出来的元素
      arr[j+1] = arr[j]
      j--
    }
    arr[j+1] = temp
  }
  console.log(arr)
}
insetSort([3,44,38,5,47,15,36,26,27,2,46,4,19,50,48])

图片描述

插入排序在最好的状况下,也就是数组正序排列的时候,只要执行n-1次比较和0次交换时间复杂度为O(n),当为倒序时,须要n^2/2次比较和n^2/2次交换,其时间复杂依然为O(n^2)spa

总结

这篇文章主要介绍了几个最简单的排序算法,后面的文章会继续介绍排序算法相关的内容。
若是有错误或不严谨的地方,欢迎批评指正,若是喜欢,欢迎点赞收藏设计

相关文章
相关标签/搜索