排序
把某个乱序的数组变成升序或者降序的数组。 sort 动画地址: https://visualgo.net/zh/sorting
冒泡排序
- 比较所有相邻的元素,如果第一个比第二个大,则交换他们
- 一轮下来,则可以保证最后一个数是最大的
- 执行n-1轮,则可以完成排序 ```javascript /*
- 性能较差
- 时间复杂度O(n^2)
*/
Array.prototype.bubbleSort = function () {
for(let i = 0; i< this.length - 1; i++) {
} }for (let j = 0; j < this.length - 1 - i; j++) {if (this[j] > this[j + 1]) {swap(this, this[j], this[j + 1])}}
function swap(arr, i1, l2) { let temp = arr[i1] arr[i1] = arr[i2] arr[i2] = temp }
const arr = [5,4,2,3,1] arr.sort() console.log(‘arr’, arr)
<a name="RQSqy"></a>### 快速排序> 性能较好.时间复杂度O(n * logn). 其中递归O(logn), 遍历分区O(n)1. 从数组中选择一个基准,所有比基准小的元素放在基准前面,比基准大的元素放在基准后面1. 递归:递归的对基准前后的子数组进行分区```javascriptArray.prototype.quickSort = function () {const rec = (arr) => {if (arr.length === 1) {return arr}const left = []const right = []const base = arr[0]for (let i = 1; i < arr.length; i++) {if (arr[i] < base) {left.push(arr[i])} else {right.push(arr[i])}}return [...rec(left), base, ...rec(right)]}const res = rec(this)console.log(res)res.forEach((item, index)=>{this[index] = item})}const arr = [2,4,5,3,1]arr.quickSort()// console.log('arr', arr)
搜索
找出数组中的位置或者下标。 indexOf
顺序搜索
Array.prototype.sequentialSearch = function (item) {for (let i = 0; i < this.length; i++){if(this[i] === item){return i}}return -1}
二分搜索
有个前提是顺序数组. 时间复杂度O(logn)
- 从数组中间元素开始,如果中间元素正好是目标值,则搜索结束
- 如果目标值大于或者小于中间元素,则在大于或者小于中间元素的那一半数组中搜索
```javascript
Array.prototype.sequentialSearch = function (item) {
for (let i = 0; i < this.length; i++){
} return -1 }if(this[i] === item){return i}
Array.prototype.binarySearch = function (item){ let low = 0 let high = this.length - 1
while(low <= high) {const mid = Math.floor((low + high)/2)if(this[mid] < item) {low = mid + 1} else if(this[mid] > item) {high = mid - 1} else {return mid}}return -1
}
const res = [1,2,3,4,5].binarySearch(3) console.log(‘res’, res)
```
