// 通用函数function swap(array, left, right) { let rightValue = array[right] array[right] = array[left] array[left] = rightValue}/* 1冒泡排序* 原理:* 从第一个元素开始,把当前元素current与下一个索引对应的元素next进行比较,如果current > next(升序),* 则交换位置,重复此操作直到最后一个元素,此时最后一个元素就是这个数组中最大的元素,下一轮比较中已经确定顺序的* 元素就不需要参与了* 时间复杂度:平方阶O(n^2)*/function bubbleSort(array) { for (let i = array.length - 1; i > 0; i--) { for (let j = 0; j < i; j++) { if (array[j] > array[j + 1]) { swap(array, j, j + 1) } } }}/* 2插入排序* 原理:* 默认第一个元素已经排好序了,取下一个元素和当前元素作比较,如果当前元素大(升序)就交换位置,* 此时前两个元素已经排好序了,再取下一个元素和前面已经排好序的元素在进行比较(从后往前比较, * 因为下一个元素是和前面已经排好序的的最后一个元素是连着的)* 时间复杂度:平方阶O(n^2)*/function insertSort(array) { for (let i = 1; i < array.length; i++) { for (let j = i - 1; j >= 0; j--) { if (array[j] > array[j + 1]) { swap(array, j, j + 1) } } }}/* 3选择排序 (选择最小的)* 原理:* 从索引值0开始,与后面元素依次进行比较,如果索引值0的元素比某个元素大,则交换位置(升序),* 第一轮比较完之后,索引值0位置的元素就是最小的,下一轮取索引值是1的元素重复操作,寻找下一* 个相对比较小的值* * 时间复杂度:平方阶O(n^2)*/function selectionSort(array) { for (let i = 0; i < array.length - 1; i++) { for (let j = i + 1; j < array.length; j++) { if (array[i] > array[j]) { swap(array, i, j) } } }}/** * 4快速排序 * 原理: * (1)在数据集之中,选择一个元素作为"基准"(pivot)。 * (2)所有小于"基准"的元素,都移到"基准"的左边;所有大于"基准"的元素,都移到"基准"的右边。 * (3)对"基准"左边和右边的两个子集,不断重复第一步和第二步,直到所有子集只剩下一个元素为止。 * * 时间复杂度:平均时间复杂度O(nlogn) 最差复杂度O( n^2 ) */function quickSort(array) { // 递归只剩一个元素的时候直接返回 if (array.length <= 1) { return array; } const pivotIndex = Math.floor(array.length / 2) const pivot = array.splice(pivotIndex, 1)[0]; const left = []; const right = []; for (let i = 0; i < array.length; i++) { if (array[i] < pivot) { left.push(array[i]); } else { right.push(array[i]); } } return [...quickSort(left), pivot, ...quickSort(right)]}