冒泡排序
思路
外层循环,从最大值开始递减,因为内层是两两比较,因此最外层当>=2时即可停止;
内层是两两比较,从0开始,比较inner与inner+1,因此,临界条件是inner<outer -1
1
2
3
4
5
6
7
8
9
10
11
12
13
14function bubleSort(arr){
let len = arr.length
for(let i = len;i >= 2 ; i--){
for(let j = 0 ;j <= i - 1;j++){
if(arr[j] > arr[j+1]){
//传统写法
// let temp = arr[inner];
// arr[inner] = arr[inner + 1]
// arr[inner + 1] = temp;
[arr[j],arr[j+1]]= [arr[j+1],arr[j]]
}
}
return arr
}
选择排序
思路:每一次待排序的数组选择最大(最小)的一个元素作为首元素,直到排完为止
1
2
3
4
5
6
7
8
9
10
function selectSort(arr){
let len = arr.length;
for(let i = 0;i<len-1;i++){
for(let j = i+1;j<len;j++){
if(arr[i] > arr[j]){
[arr[i],arr[j]]=[arr[j],arr[i]]
}
}
}
}
插入排序
思路:第一个元素作为已经排序的,取下一个元素,在已经排序的元素序列中从后往前扫描
1
2
3
4
5
6
7
8
9
10
function insertSort(arr) {
let len = arr.length
for(let i = 1;i < len; i++){
for(let j = i;j > 0;j--){ //往前查找
if(arr[j] < arr[j-1]){
[arr[j],arr[j-1]] = [arr[j-1],arr[j]]
}
}
}
}
快速排序
思路
选择一个基准元素,将列表分割成两个子序列;
对列表重新排序,将所有小于基准值的元素放在基准值前面,所有大于基准值的元素放在基准值的后面
分别对较小元素的子序列和较大元素的子序列重复步骤1和2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15function quickSort(arr){
if(arr.length <= 1){
return arr
}
let left = [],right = [];
let current = arr.splice(0,1)//注意splice后,数组长度少了一个
for(let i = 0 ;i<arr.length;i++){
if(arr[i]< current){
left.push(arr[i])
}else{
right.push(arr[i])
}
}
return quickSort(left).concat(current,quickSort(right))
}