“这是我参与更文挑战的第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就是递归的终止条件因为要是不终止的情况就无限调用了