冒泡排序
先找最大,从右到左
时间复杂度:O(n2)
空间复杂度:O(n)
思路:内层循环通过依次比较,将最大值放到最后面,在此基础上增加外部循环,每次外部循环都会排除已经完成排序的下标,再算出最大值,并放到排除已经排序的数组最后
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
|
function bubbleSort(arr) { for (let j = 0; j < arr.length - 1; j++) { for (let i = 0; i < arr.length - 1 - j; i++) { if (arr[i] > arr[i + 1]) { let temp = arr[i] arr[i] = arr[i + 1] arr[i + 1] = temp } } } return arr }
|
选择排序
先找最小,从左到右
时间复杂度:O(n2)
空间复杂度:O(n)
思路:内层循环每次找到最小的下标并放到数组最前面,再此基础上增加外部循环,外部循环每次以循环下标为坐标,寻找最小值换位到坐标中,一次完成排序
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
|
function selectionSort() { for (let i = 0; i < arr.length - 1; i++) { let indexMin = i for (let j = i; j < arr.length; j++) { if (arr[j] < arr[indexMin]) { indexMin = j } } if (indexMin != i) { let temp = arr[i] arr[i] = arr[indexMin] arr[indexMin] = temp } } return arr }
|
插入排序
从第二开始,依次从右到左开始比较最小值
时间复杂度:O(n2)
空间复杂度:O(n)
思路:从第二位开始,和前面的进行比较,如果前面的大于后面,则后面的等于前面的,继续向前找,如果找到了前面的小于后面都,则停止查找,覆盖该下标,如果到最开始都没有找到最小的,则将第一位变成比较值
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
|
function inSetrSort(arr) { for (let i = 1; i < arr.length; i++) { let j = i let temp = arr[j] while (j > 0) { if (temp > arr[j - 1]) { break } arr[j] = arr[j - 1] j-- } arr[j] = temp } return arr }
|
归并排序
难度较大,后续再看
快速排序
难度较大,后续再看
顺序搜索
在目标函数中寻找目标值,找不到则返回-1
时间复杂度:O(n)
1 2 3
| function searchSort(list, carry) { return list.findIndex(e => e == carry) }
|
二分搜索
针对有序数组的单项查找方法,找到会返回下标,未找到则返回-1,他的性能要高于顺序搜索,每次搜索都会将现有数组批成两半
时间复杂度:O(logN)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| let bin = [1, 2, 3, 4, 5, 6, 7, 8, 9]
function binarySearch(list, carry) { let low = 0 let high = list.length - 1 while (low <= high) { const mid = Math.floor((low + high) / 2) const ele = list[mid] if (carry > ele) { low = mid + 1 } else if (carry < ele) { high = mid - 1 } else if (carry == ele) { return mid } } return -1 }
console.log(binarySearch(bin, 1));
|