检索算法
检索方式分为:顺序查找和二分查找。
顺序查找
代码实现
function seqSearch(arr, data) {
for (let i = 0, len = arr.length; i < len; i++) {
if (arr[i] === data) {
return i;
}
}
return -1;
}
查找最小值
function findMin(arr) {
let min = arr[0];
for (let i = 1, len = arr.length; i < len; i++) {
if (arr[i] < min) {
min = arr[i];
}
}
return min;
}
查找最大值
function findMin(arr) {
let max = arr[0];
for (let i = 1, len = arr.length; i < len; i++) {
if (arr[i] > max) {
max = arr[i];
}
}
return max;
}
使用自组织数据
function swap(arr, idx, idx2) {
const temp = arr[idx];
arr[idx] = arr[idx2];
arr[idx2] = temp;
}
- 冒泡方式
function seqSearch(arr, data) {
for (let i = 0, len = arr.length; i < len; i++) {
if (arr[i] === data) {
if (i > 0) {
swap(arr, i, i - 1);
return i - 1;
}
return i;
}
}
return -1;
}
- 移到队首
function seqSearch(arr, data) {
for (let i = 0, len = arr.length; i < len; i++) {
if (arr[i] === data) {
// 2-8原则,远离20%的才移动到队首
if (i > (arr.length * 0.2)) {
swap(arr, i, 0);
return 0;
}
return i;
}
}
return -1;
}
二分查找
代码实现
function bindSearch(arr, data) {
let upperBound = arr.length - 1;
let lowerBound = 0;
while(lowerBound <= upperBound) {
const mid = Math.floor((upperBound + lowerBound) / 2);
if (arr[mid] < data) {
lowerBound = mid + 1;
} else if (arr[mid] > data) {
lowerBound = mid - 1;
} else {
return mid;
}
}
return -1;
}
计算重复次数
function count() {
let count = 0;
const postion = bindSearch(arr, data);
if (position > -1) {
count++;
for (let i = position - 1, i > 0; i--) {
if (arr[i] === data) {
count++;
} else {
break;
}
}
for (let i = position + 1, len = arr.length; i < len; i++) {
if (arr[i] === data) {
count++;
} else {
break;
}
}
}
return count;
}
欢迎到前端自习群一起学习~516913974