1.二分查找 (2022-08-09)
/**
*
* @param {*} arr 有序数组
* @param {*} x 要查找的值
* @returns 如果找到返回该元素在数组中的位置,如果没有找到返回-1
* 循环不变量
*/
function binarySearch(arr, x) {
// l 左数据 r 右数据 g 位置
let l = 0, r = arr.length - 1, g = 0;
while (l <= r) {
g = Math.floor((l + r) / 2);
if (arr[g] === x) { return g }
else if (arr[g] > x) { r = g - 1 }
else { l = g + 1 }
}
return -1
}
const arr = [2, 4, 5, 6, 7, 9, 13];
console.log(binarySearch(arr, 9)) // 5
console.log(binarySearch(arr, 8)) // -1
console.log(binarySearch(arr, 13)) // 6
2.插入排序(2022-08-10)
/**
*
* @param {*} A 有序数组
* @param {*} x 将要插入到数组中的元素
*/
function base_insert(A, x) {
let p = A.length - 1
while (p > 0 && A[p] > x) {
A[p + 1] = A[p]
p--
}
A[p + 1] = x
}
/**
* 基于将一个元素插入到一个有序的数组中进行改进
* @param {*} A 传入的待排序的数组
* @param {*} i 数组中的下表
* @param {*} x 数组中下表对应的值
*/
function base_insert(A, i, x) {
let p = i - 1
while (p > 0 && A[p] > x) {
A[p + 1] = A[p]
p--
}
A[p + 1] = x
}
/**
*
* @param {*} arr 传入待排序数组
*/
function insert_sort(arr) {
for (let i = 1; i < arr.length; i++) {
base_insert(arr, i, arr[i])
}
}
const arr = [2, 3, 14, 6, 7, 9, 13]
insert_sort(arr)
console.log(arr) // [ 2, 3, 6, 7, 9, 13, 14 ]
3.冒泡排序(2022-08-11)
/**
* 冒泡排序
* 外层循环控制气泡的冒出
* 内层循环进行比较大小并且控制位移
* i=1
* j=1 A=[5,8,1,3,2,4,6]
* j=2 A=[5,1,8,3,2,4,6]
* j=3 A=[5,1,3,8,2,4,6]
* j=4 A=[5,1,3,2,8,4,6]
* j=5 A=[5,1,3,2,4,8,6]
* j=6 A=[5,1,3,2,4,6,8]
* i=2
* i=3
* i=4
* i=5
* i=6
*/
function bubble_sort() {
for (let i = A.length - 1; i >= 1; i--) {
for (let j = 1; j <= i; j++) {
A[j - 1] > A[j] && swap(A, j - 1, j)
}
}
}
/**
* 交换数组中两个元素的位置
* @param {*} A 传入的数组
* @param {*} i
* @param {*} j
*/
function swap(A, i, j) {
const temp = A[i]
A[i] = A[j]
A[j] = temp
}
const A = [5,8,1,3,2,4,6]
bubble_sort(A)
console.log(A) // [ 1, 2, 3, 4, 5, 6, 8 ]