初级算法排序-插入排序以及递归算法

208 阅读2分钟

“这是我参与更文挑战的第1,活动详情查看: 更文挑战” 比如现在有63245这样的一个数组 , 我们想用对它进行由小到大的排序, 我们可以怎么做呢 ?

1.首先我们先来看下插入排序。 我们可以先固定住第一个数字6, 然后从第二数字开始 , 如果左边比右边的大, 我们就交换位置。如果不大的话, 就进行下一个数字的比较 那么第一次交换下来是:

  • 6,3,2,4,5
3,6,2,4,5

然后比较下一个数字 ,

  • 3,6,2,4,5
2比6小进行交换: 
 3,2,6,4,5
2比3小, 然后进行交换
 2,3,6,4,5

然后将指针移动到第四个数字, 也就是:

  • 2,3,6,4,5
4比6小, 所以进行交换
- 2,3,4,6,5
4比3大不做任何操作

最后指针移动到第五个数字

  • 2,3,4,6,5
5比6小进行交换
2,3,4,5,6
5比4大就不做任何操作 

这样子就实现了整个数组的插入排序。 代码实现是

  let arr = [6, 3, 2, 4, 5]

    function insertSort(arr) {
      for (let i = 1; i < arr.length; i++) {
        for (let j = i - 1; j >= 0 && arr[j] > arr[j + 1]; j--) {
          let k = arr[j]
          arr[j] = arr[j + 1]
          arr[j + 1] = k

        }
      }
      return arr
    }
    console.log(1111, insertSort(arr))

这个算法的时间复杂度是1+2+3+...n-1, 所以最后的时间复杂度是 O(N^2)

然后我们学习一下递归算法为后面的归并做准备 比如说一个数组[4,7,5,9,10], 我想求出这个数组的最大值 , 我们应该怎么做呢 ? 我们首先可以先将数组一分为二, 分别求出左右两边的最大值, a:[4,7,5], b:[9,10], 因为左边数组长度还是很多, 无法求出最大 , 所以需要继续拆分 然后将a数组一分为2, c:[4], d: [7,5], c数组可以获取最大值就是4, d数组继续拆分成[7][5],求出最大的是7, 然后c d数组中的最大值就是 7, 也就是a数组中的最大值就是 7 b数组拆分成[9], [10],无法拆分, 求出最大值是10 ,也就是b数组的最大值是10 然后ab数组中的最大值进行比较, 最后得出10 其实整个过程:就是一直从中间拆分 , 拆到不能拆了(也就是左侧的index和右侧的index相同),然后Math.max(左右两边的数)

代码实现是 :

    function getMax(arr, leftIndex, rightIndex) {
      // baseCase 就是拆分的最小单元的意思
      if (leftIndex == rightIndex) {
        return arr[leftIndex]
      }

      let mid = (Math.floor((leftIndex + rightIndex) / 2))
      let leftMax = getMax(arr, 0, mid)
      let rightMax = getMax(arr, mid + 1, rightIndex)
      return Math.max(leftMax, rightMax)

    }

baseCase就是递归的终止条件因为要是不终止的情况就无限调用了