1、冒泡排序:时间复杂度O(n)
    image.png

    1. function bubbleSort(nums) {
    2. for (let i = 0; i < nums.length; i++) {
    3. for (let j = 0; j < nums.length - 1 - i; j++) {
    4. if (nums[j] > nums[j + 1]) {
    5. let temp = nums[j + 1];
    6. nums[j + 1] = nums[j];
    7. nums[j] = temp;
    8. }
    9. }
    10. }
    11. return nums;
    12. }

    2、选择排序:时间复杂度O(n)
    image.png

    1. function selectionSort(nums) {
    2. for (let i = 0; i < nums.length; i++) {
    3. for (let j = i; j < nums.length; j++) {
    4. if (nums[j] < nums[i]) {
    5. let temp = nums[j];
    6. nums[j] = nums[i];
    7. nums[i] = temp;
    8. }
    9. }
    10. }
    11. return nums;
    12. }

    3、插入排序:时间复杂度O(nlogn)
    image.png

    1. function insertionSort(nums) {
    2. for (let i = 1; i < nums.length; i++) {
    3. let j = i;
    4. let temp = nums[i];
    5. while (j >= 0 && temp < nums[j - 1]) {
    6. nums[j] = nums[j-1];
    7. j--;
    8. }
    9. nums[j] = temp;
    10. }
    11. return nums;
    12. }

    4、归并排序:时间复杂度O(nlogn)
    采取分治思想进行排序:
    步骤1:拆分数组为小数组直至长度为1;
    步骤2:排序小数组;
    步骤3:归并所有小数组,归并的过程也进行排序(两个有序数组排序)。
    image.png

    1. function mergeSort(nums) {
    2. const len = nums.length;
    3. if (len === 1) return nums;
    4. const middle = Math.floor(nums.length / 2);
    5. const left = nums.slice(0, middle);
    6. const right = nums.slice(middle);
    7. return mergeSortImp(mergeSort(left), mergeSort(right));
    8. }
    9. function mergeSortImp(left, right) {
    10. let i = 0;
    11. let j = 0;
    12. let result = [];
    13. while (i < left.length && j < right.length) {
    14. const value = left[i] > right[j] ? right[j++] : left[i++];
    15. result.push(value);
    16. }
    17. return result.concat(i !== left.length ? left.slice(i) : right.slice(j));
    18. }

    5、快速排序:时间复杂度O(nlogn)
    步骤1:选取主元(一般是中间位置);
    步骤2:划分操作,移动左指针找到比主元大的值,移动右指针找到比主元小的值,然后交换它们。重复这个过程,直到左指针超过了右指针;
    步骤3:对划分好的小数组重复步骤1和步骤2,直至排序完成。

    1. function quickSort(nums){
    2. return quick(nums, 0, nums.length - 1);
    3. }
    4. function quick(nums, left, right) {
    5. if (nums.length <= 1) return nums;
    6. let index = partition(nums, left, right);
    7. if (left < index - 1) {
    8. quick(nums, left, index - 1);
    9. }
    10. if (index < right) {
    11. quick(nums, index, right);
    12. }
    13. return nums;
    14. }
    15. //选取主元并进行划分操作
    16. function partition(nums, left, right) {
    17. let i = left;
    18. let j = right;
    19. let middle = Math.floor((i + j) / 2);
    20. let main = nums[middle];
    21. while (i <= j) {
    22. while(nums[i] < main){
    23. i++;
    24. }
    25. while (nums[j] > main) {
    26. j--;
    27. }
    28. if (i <= j) {
    29. let temp = nums[i];
    30. nums[i]=nums[j];
    31. nums[j] = temp;
    32. i++;
    33. j--;
    34. }
    35. }
    36. return i;
    37. }

    6、图的拓扑排序
    拓扑排序是用于解决有向无环图的排序

    1. function Node(){
    2. this.parentQueue = [];
    3. this.childQueue = [];
    4. }
    5. function sortTop(nodes) {
    6. const incoming0Queue = [];
    7. const sortQueue = [];
    8. for(let node of nodes){
    9. const parentQueue = node.parentQueue || [];
    10. node.incoming = parentQueue.length;
    11. if (node.incoming === 0) {
    12. incoming0Queue.push(node);
    13. }
    14. }
    15. let node;
    16. while (node = incoming0Queue.shift()) {
    17. sortQueue.push(node);
    18. if (!node.childQueue || node.childQueue.length === 0) continue;
    19. let index = 0;
    20. let child;
    21. while (child = node.childQueue[index++]) {
    22. child.incoming = child.incoming - 1;
    23. if (child.incoming === 0){
    24. incoming0Queue.push(child);
    25. }
    26. }
    27. }
    28. return sortQueue;
    29. }