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 = ifor (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 - 1while (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 = 0let rightIndex = 0while (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 arrconst 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))}
