Bubble sort
后面的数据是有序的,所以要找出较大的值,然后前后进行调换。需要进行多次循环比较,所以时间复杂度是O(n2),要进行内外双层循环操作。
function bubbleSort (arr) {
for (let i = 0; i < arr.length; i++) {
for (let j = 0; j < arr.length - i - 1; j++) {
if (arr[j] > arr[j + 1]) {
// 保存较大的数据
const temp = arr[j]
arr[j] = arr[j + 1]
arr[j + 1] = temp
}
}
}
return arr
}
Selection sort
前面的数据是有序的,后面的数据是无序的,每次都找到数组中最小的数据,然后将其移到前面的有序列。min 保存的是最小数据的角标,i 是当次循环中的第一个数据,也是此次循环的第一个位置。将最小的数据放置到角标最小的位置。时间复杂度是O(n2)。
function selectionSort (arr) {
for (let i = 0; i < arr.length; i++) {
let min = i
for (let j = i + 1; j < arr.legnth; j++) {
if (arr[j] < arr[min]) {
min = j
}
}
const temp = arr[i]
arr[i] = arr[min]
arr[min] = temp
}
return arr
}
Insertion sort
前面的数据是有序的,后面的数据是无序的。每一次拿出一个数据,与前面的有序数据进行对比,然后将其插入到合适的位置。temp 中始终存最小的数据,可以通过改变角标的值来进一步控制对应的数据值。时间复杂度是O(n2)。
function insertionSort (arr) {
for (let i = 1; i < arr.length; i++) {
const temp = arr[i]
let j = i - 1
while (j >= 0 && temp < arr[j]) {
arr[j + 1] = arr[j]
j--
}
arr[j + 1] = temp
}
return arr
}
Merge sort
归并排序先将数组从中间进行分割,然后再进行合并。即先分割,再合并。时间复杂度为O(nlog n)。
const merge = (left, right) => {
let temp = []
let leftIndex = 0
let rightIndex = 0
while (left.length > leftIndex && right.length > rightIndex) {
if (left[leftIndex] <= right[rightIndex]) {
temp.push(left[leftIndex])
leftIndex++
} else {
temp.push(right[rightIndex])
rightIndex++
}
}
return temp.concat(left.slice(leftIndex)).concat(right.slice(rightIndex))
}
const mergeSort = (arr) => {
if (arr.length <= 1) return arr
const middle = Math.floor(arr.length / 2)
const left = arr.slice(0, middle)
const right = arr.slice(middle)
return merge(mergeSort(left), mergeSort(right))
}
Quick sort
快排采用递归的方式来进行排序,先找一个中点值,小于此值的放到左侧数组,大于此值的放到右侧数组,然后再对左右两个数组进行递归排序。最后将两者连接到一起。时间复杂度为O(nlog n)。
function quickSort (arr) {
if (arr.length <= 1) {
return arr
}
const pivot = arr[0]
const left = []
const right = []
for (let i = 1; i <= arr.length; i++) {
if (arr[i] < pivot) {
left.push(arr[i])
} else {
right.push(arr[i])
}
}
return quickSort(left).concat(pivot, quickSort(right))
}