[js] 几种检索算法
#
function findMin(arr) { var min = arr[0]; for (var i = 1; i < arr.length; ++i) { if (arr[i] < min) { min = arr[i]; } } return min; } function findMax(arr) { var max = arr[0]; for (var i = 1; i < arr.length; ++i) { if (arr[i] > max) { max = arr[i]; } } return max; } //顺序查找实现indexOf。比Array.indexOf()慢 function seqSearch(arr, data) { for (var i = 0; i < arr.length; ++i) { if (arr[i] == data) { return i; } } return -1; } //自组织数据 function seqSearch(arr, data) { var temp; for (var i = 0; i < arr.length; ++i) { if (arr[i] == data) { if (i > 0) { temp = arr[i]; arr[i] = arr[i - 1]; arr[i - 1] = temp; } return true; } } return false; } //80-20原则,优化的自组织数据 function seqSearch(arr, data) { var temp; for (var i = 0; i < arr.length; ++i) { if (arr[i] == data && i > (arr.length * 0.2)) { temp = arr[i]; arr[i] = arr[0]; arr[0] = temp; return true; } else if (arr[i] == data) { return true; } } return false; } //二分法查找有序数组 function binSearch(arr, data) { var upperBound = arr.length - 1; var lowerBound = 0; while (lowerBound <= upperBound) { var mid = Math.floor((upperBound + lowerBound) / 2); if (arr[mid] < data) { lowerBound = mid + 1; } else if (arr[mid] > data) { upperBound = mid - 1; } else { return mid; } } return -1; } //统计查找出的数据的个数 function count(arr, data) { var count = 0; var position = binSearch(arr, data); if (position > -1) { ++count; for (var i = position - 1; i > 0; --i) { if (arr[i] == data) { ++count; } else { break; } } for (var i = position + 1; i < arr.length; ++i) { if (arr[i] == data) { ++count; } else { break; } } } return count; }