1、二分法
function bsearch(arr, target) {
let l = 0, // 查询范围左边界
r = arr.length - 1, // 查询范围有边界
g // 猜测位置
while(l <= r) {
g = Math.floor((l + r) / 2)
if (arr[g] === target) return g
else if (arr[g] < target) {
r = g - 1
} else {
l = g + 1
}
}
return -1
}
2、插入排序
function insert(A, i , x) {
let p = i - 1
while ( p > 0 && A[p] > x) {
A[p + 1] = A[p]
p--
}
A[p + 1] = x
}
function insert_sort(A) {
for(let i = 1 ; i < A.length ; i++) {
insert(A, i , A[i])
}
}
3、冒泡排序
function bubble_sort(A) {
for (let i = A.length - 1 ; i >= 1 ; i--) { // i 指向最大值-》倒数第二大的值
for (let j = 1 ; j <= i ; j++) {
if(A[j - 1] > A[j]) {
let temp = A[j]
A[j] = A[j - 1]
A[j - 1] = temp
}
}
}
}
4、合并排序
// A 数组
// p 排序开始位置
// q 排序取的中间位置
// r 排序最右边位置
function merge(A, p, q, r) {
let A1 = A.slice(p, q) // 左边的数组
let A2 = A.slice(q, r) // 右边的数组
A1.push(Number.MAX_SAFE_INTEGER)
A2.push(Number.MAX_SAFE_INTEGER)
for(let k = p, i = 0, j = 0 ; k < r ; k++) {
// 两个数组对比大小,选取小的占k的位置
A[k] = A1[i] < A2[j] ? A1[i++] : A2[j++]
}
}
// A 数组
// p 排序开始位置
// q 排序结束位置
function merge_sort(A, p, r) {
if ((r - q) < 2) return
let q = Math.ceil((r - q) / 2)
merge_sort(A, p, q) // 递归将左边数组拆分
merge_sort(A, q, r) // 递归将右边数组拆分
merge(A, p , q, r) // 合并拆分的数组
}