1. 冒泡排序
- 遍历数组,比较相领的两位,大的放在后面(如果结果是从大到小,就小的放后面)
- 第一趟比较n个,第二趟比较n-1个(最后不是最大就是最小),直到剩下一个
function bubbleSort(arr) {
let leng = arr.length
let temp
for (let i = 0
for (let j = 0
if (arr[j] > arr[j + 1]) {
temp = arr[j]
arr[j] = arr[j + 1]
arr[j + 1] = temp
}
}
}
return arr
}
let arr = [1, 2, 3, 4, 5, 8, 6, 2, 5, 1]
console.log(bubbleSort(arr))
2. 插入排序
- 从第二位开始遍历
- 当前值与前面的值依次比较(从后往前),大的向后移动一位,直到遇到比当前值小的或比较完。
- 当前位置放入遇到的小的值后面或者最前面
- 上面这么操作后当前值前面的值就都是从小到大排列了
function insertionSort(arr) {
let len = arr.length
let preIndex, current
for (let i = 1
preIndex = i - 1
current = arr[i]
while (preIndex >= 0 && arr[preIndex] > current) {
arr[preIndex + 1] = arr[preIndex]
preIndex--
}
arr[preIndex + 1] = current
}
return arr
}
let arr = [2, 4, 5, 3, 7, 5]
console.log(insertionSort(arr))
3.快速排序
- 递归
- 每次从数组中取一个值base,遍历数组。
- 将值与 base 比较,大的放入右边数组,小的放入左边数组。
- 返回左边、base、右边的合并数组
function quickSort(arr) {
if (arr.length <= 1) {
return arr
}
let leng = arr.length
let baseNumber = Math.floor(leng / 2)
let base = arr.splice(baseNumber, 1)
let left = []
let right = []
for (let i = 0
if (arr[i] < base) {
left.push(arr[i])
} else {
right.push(arr[i])
}
}
return quickSort(left).concat(base, quickSort(right))
}
let arr = [5, 2, 8, 6, 4, 7, 9, 5, 3]
console.log(quickSort(arr))
4.选择排序
- 从前往后遍历
- 将当前值与后面的依次比较,大的话两个位置值交换
- 直到遍历结束,结果就会使从大到小或者从小到大
function selectionSort(arr) {
for (let i = 0
for (let j = i + 1
if (arr[i] > arr[j]) {
let temp = arr[j]
arr[j] = arr[i]
arr[i] = temp
}
}
}
return arr
}
let arr = [2, 1, 3, 5, 4, 6, 8]
console.log(selectionSort(arr))
5. 二分排序
- 递归函数fn
- 创建左右数组,取一个值,遍历数组,小的放入左数组,大的放入右数组
- 返回fn(左数组).concat(中间值, fn(右数组))
function fn(arr) {
if(arr.length<=1){
return arr;
}
let middle = arr[0];
let leftArr = [];
let rightArr = [];
for(let i=1; i<arr.length;i++){
if(arr[i]<middle){
leftArr.push(arr[i])
}else{
rightArr.push(arr[i])
}
}
return fn(leftArr).concat(middle, fn(rightArr))
}