1.冒泡排序 Bubble Sort
原理: 冒泡排序在每次冒泡操作时会比较相邻的两个元素,看是否满足大小关系要求,不满足就将它俩互换。一直迭代到不再需要交换,也就是排序完成。
function BubbleSort(arr) {
let temp
for(let i = 0 ; i < arr.length - 1 ; i++) {
for(let j = 0 ; j < arr.length - 1 - i; j++) {
if(arr[j] > arr[j+1]) {
temp = arr[j]
arr[j] = arr[j+1]
arr[j+1] = temp
}
}
}
return arr
}
2.选择排序
原理:将最小的元素存放在数组起始位置,再从剩下的未排序的序列中寻找最小的元素,然后将其放到已排序的序列后面。
以此类推,直到排序完成。
function selectSort(arr) {
let minIndex, temp
for (let i = 0; i < arr.length; i++) {
minIndex = i
for (let j = i + 1; j < arr.length; j++) {
if (arr[j] < arr[minIndex]) {
minIndex = j
}
}
temp = arr[i]
arr[i] = arr[minIndex]
arr[minIndex] = temp
}
return arr
}
3.插入排序
原理:插入排序顾名思义,对于未排序的数据,在已排序的序列中从后往前扫描,找到相应的位置进行插入,保持已排序序列中元素一直有序。
从 i 等于 1 开始遍历,拿到当前元素 cur,与前面的元素进行比较。
如果前面的元素大于当前元素,就把前面的元素和当前元素进行交换,不断循环直到未排序序列中元素为空,排序完成。
var arr = [1, 12, 6, 3, 5];
function insertSort(arr) {
let cur, prev
for (let i = 1; i < arr.length; i++) {
cur = arr[i]
prev = i - 1
while (prev >= 0 && arr[prev] > cur) {
arr[prev + 1] = arr[prev]
prev--
}
arr[prev + 1] = cur
}
return arr
}
4.快速排序
原理: 快速排序通过遍历数组,将待排序元素分隔成独立的两部分,一部分记录的元素均比另一部分的元素小,则可以分别对这两部分记录的元素继续进行排序,直到排序完成。
function quickSort(arr) {
if (arr.length <= 1) return arr
let middleIndex = Math.floor(arr.length / 2)
let middleValue = arr.splice(middleIndex, 1)[0]
let arrayLeft = [],
arrayRight = []
for (let i = 0; i < arr.length; i++) {
let item = arr[i]
item < middleValue ? arrayLeft.push(item) : arrayRight.push(item)
}
return quickSort(arrayLeft).concat(middleValue, quickSort(arrayRight))
}