[toc]
# 题1、交换两个数的实现?
答:
~~~
let a = 1
let b = 2
写法一、使用中间变量
let tmp = a
a = b
b = tmp
写法二、数组赋值
[a,b] = [b,a]
~~~
# 题1、5分钟之内写出冒泡排序法?
答:思路:双层循环,两两比较,交换。
最坏时间复杂度:O(n^2)
~~~
let arr = [3,5,3,1,3,4,5,6,4,3,28,9,7,4,3]
// 控制比较的次数
for(let i=0; i<arr.length; i++) {
for(let j=0; j<arr.length-1; j++) {
// 前一个和后一个比较
if(arr[j] > arr[j+1]) {
// 交换
[arr[j], arr[j+1]] = [arr[j+1], arr[j]]
}
}
}
~~~
# 题2、5分钟之内写出折半查找法?
答:前提:只能对已经 `排好序` 的数据使用折半查找法。
思路:每次和中间的元素查找,如果查找的元素比它大,就向右查找中间的,如果小就向左查找中间的。
时间复杂度:O(logn)
![](https://img.kancloud.cn/6b/49/6b49f54559e34b5733b20df03d04122e_734x222.png)
折半查找法代码
~~~
// 参数一、有序数组
// 参数二、要查找的数字
// 参数三、开始的下标
// 参数四、结束的下标
function halfSearch(arr, key, left, right) {
let mid // 中间位置的坐标
while(right>left) {
// 计算中间元素的下标
mid = Math.floor((left + right ) / 2)
// 如果找到了就直接返回下标
if(key == arr[mid]) {
return mid
} else if(key < arr[mid]) {
// 右边界变为中间元素-1
right = mid-1
} else if(key > arr[mid]) {
left = mid+1
}
}
// 没找到
return -1
}
let arr = [1, 4, 7, 8, 12, 34, 66, 212, 67787, 324345]
console.log( halfSearch(arr, 67787, 0, arr.length-1) )
~~~