[TOC]
# 题1、交换两个数的实现方法?
答:
~~~
let a = 12
let b = 14
// 写法一、使用中间变量
let tmp = a
a = b
b = tmp
// 写法二、数组赋值
[a,b] = [b,a]
~~~
# 题2、写出冒泡排序法?
答:思路:双层循环,两两比较,判断、交换。
最坏事件复杂度: `O(n^2)`
~~~
// 思路: 先比较一轮一次,然后用for循环比较一轮多次,然后再加for循环比较多轮多次
let arr = [8, 11, 9, 10, 3, 8, 343, 1, 99, 23, 65]
// 比较轮数
for (var i = 0; i < arr.length; i++) {
// 每轮比较次数,次数 = 长度 - 1 - 此时的轮数
for (var j = 0; j < arr.length - 1 - i; j++) {
// 相邻元素两两对比,元素交换,大的元素交换到后面
if (arr[j] > arr[j + 1]) {
// 交换
// [arr[j], arr[j + 1]] = [arr[j + 1], arr[j]]
let kong = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = kong;
}
}
}
~~~
# 题3、写出折半查找法?
答:前提:只能对已经 `排好序` 的数据使用折半查找法。
思路:每次和中间的元素查找,如果查找的元素比它大,就向右查找中间的,如果小就向左查找中间的。
时间复杂度: O(logn)
![](http://ww1.sinaimg.cn/large/007WurYGgy1gf8jd05t4kj30ke066taw.jpg)
代码演示
~~~
// 参数一、有序数组
// 参数二、要查找的数字
// 参数三、开始的下标
// 参数四、结束的下标
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, 6767, 23428]
console.log(halfSearch(arr, 4, 0, arr.length - 1))
~~~