# 习题
# 排序
# 选择排序O(n2)
- 遍历未排序的数
- 找到最小(选择)
- 记录最小值
- 交换
function SelectionSort(arr){
for(let i = 0; i < arr.length-1; i++) {
minIndex = i
for(let j = i+1 ; i<arr.length;j++){
minIndex = arr[j]<arr[minIndex]?j:minIndex
}
swap(arr,i,minIndex)
}
}
function swap(a,b){
temp = a;
a = b;
b = temp;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 冒泡排序O(n2)
- 遍历
- 相邻两个做比较
function BubbleSort(arr){
for(let i= 0;i<length-1;i--){
for (let j=0;j<arr.length-1-i;j++){
if(arr[j]>arr[j+1]){
swap(arr,j,j+1)
}
}
}
}
// 异或
function swap(a,b){
a = a^b
b = a^b
a = a^b
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 插入排序O(n2)
逐一拿起排序
function insertionSort(arr){
for(let i= 1;i<arr.length;i++){
for(let j=i-1; arr[j] > arr[j+1] && j >=0;j--){
swap(arr,j,i)
}
}
}
1
2
3
4
5
6
7
2
3
4
5
6
7
# 归并排序
- 分治法:分割 集合
function mergeSort(arr){
if(arr.length<=1) return arr;
let middle = arr.length>>1
let left = mergeSort(arr.slice(0,middle))
let right = mergeSort(arr.slice(middle))
return merge(left,right)
}
function merge(left,right){
result = []
while(left.length > 0 && right.length>0){
left[0]<right[0]?result.push(left.shift()):result.push(right.shift())
}
return result.concat(left,right)
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 快速排序
TODO
# 查找
# 二分查找
# 小片段
# 抑或位运算
// 交换
function swap(a,b){
a = a^b
b = a^b
a = a^b
}
// 假设一个数组中有两个数组出现基数次,找到他们
// 解:eor=a^b
function findx(arr){
let eor = 0
for(x of arr){
eor = eor^x
}
rightOne=eor&(~eor+1) // 分类依据
a = 0
for(j of arr){
// 加括号 先位运算 后判断
if((j&rightOne) == 0){
a = a^j
}
}
b = eor^a
console.log(a,b)
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26