看动画学排序

冒泡排序

  1. // 冒泡排序
  2. let bubbleSort = (arr) => {
  3. if (arr.length <= 1) {
  4. return arr;
  5. }
  6. for (let i = 0; i < arr.length -1; i++) {
  7. for (let j = i + 1; j < arr.length; j++) {
  8. if (arr[i] > arr[j]) {
  9. let temp = arr[i];
  10. arr[i] = arr[j];
  11. arr[j] = temp;
  12. }
  13. }
  14. }
  15. return arr;
  16. }
  17. console.log('bubbleSort', bubbleSort([2, 3, 11, 6, -3]));

选择排序

遍历数组n次,每次将最小的数拿出来按顺序放到新数组中返回

  1. // 选择排序
  2. let getMinIndex = (arr) => {
  3. if (arr.length === 0) {
  4. return;
  5. }
  6. let minIndex = 0;
  7. for (let i=0; i<arr.length; i++) {
  8. if (arr[i] < arr[minIndex]) {
  9. minIndex = i;
  10. }
  11. }
  12. return minIndex;
  13. }
  14. let swap = (arr, i, j) => {
  15. if (i !== j) {
  16. let temp = arr[i];
  17. arr[i] = arr[j];
  18. arr[j] = temp;
  19. }
  20. }
  21. let selectSort = (arr) => {
  22. if (arr.length <= 1) {
  23. return arr;
  24. }
  25. for (let i=0; i<arr.length-1; i++) {
  26. swap(arr, i, getMinIndex(arr.slice(i)) + i);
  27. }
  28. return arr;
  29. }
  30. console.log('selectSort', selectSort([2, 3, 11, 6, -3]));

快速排序

从数组中间取一个数,遍历整个数组,比这个数小的放左边,比这个数大的放右边

  1. // 快速排序
  2. let quickSort = (arr) => {
  3. if (arr.length <= 1) {
  4. return arr;
  5. }
  6. let pivotIndex = Math.floor(arr.length / 2);
  7. let pivot = arr.splice(pivotIndex, 1)[0];
  8. let left = [];
  9. let right = [];
  10. for (let i = 0; i < arr.length; i++) {
  11. if (arr[i] < pivot) {
  12. left.push(arr[i]);
  13. } else {
  14. right.push(arr[i]);
  15. }
  16. }
  17. return quickSort(left).concat([pivot], quickSort(right));
  18. }
  19. console.log('quickSort', quickSort([2, 3, 11, 6, -3]));

归并排序

将数组从中间分成左右两个数组,分别排序后合并

  1. // 归并排序
  2. let mergeSort = (arr) => {
  3. let k = arr.length;
  4. if (k <= 1) {
  5. return arr;
  6. }
  7. let left = arr.slice(0, Math.floor(k/2));
  8. let right = arr.slice(Math.floor(k/2));
  9. return merge(mergeSort(left), mergeSort(right));
  10. }
  11. let merge = (a, b) => {
  12. if (a.length === 0) {
  13. return b;
  14. }
  15. if (b.length === 0) {
  16. return a;
  17. }
  18. return a[0] > b[0]? [b[0]].concat(merge(a, b.slice(1))) :
  19. [a[0]].concat(merge(a.slice(1), b));
  20. }
  21. console.log('mergeSort', mergeSort([2, 3, 11, 6, -3]));

计数排序

使用哈希表将每个数出现的次数保存起来,再遍历哈希表排序

  1. // 计数排序, 只能排整数数组
  2. let countSort = (arr) => {
  3. if (arr.length <= 1) {
  4. return arr;
  5. }
  6. let hashTable = {},
  7. max = arr[0],
  8. min = arr[0],
  9. result = [];
  10. for (let i = 0; i < arr.length; i++) {
  11. // console.log(i, arr[1]);
  12. if (!(arr[i] in hashTable)) {
  13. hashTable[arr[i]] = 1;
  14. } else {
  15. hashTable[arr[i]] += 1;
  16. }
  17. if (arr[i] > max) {
  18. max = arr[i];
  19. }
  20. if (arr[i] < min) {
  21. min = arr[i];
  22. }
  23. }
  24. // 遍历哈希表
  25. for (let i = min; i <= max; i++) {
  26. if (i in hashTable) {
  27. // console.log('2',i)
  28. for (let j = 0; j < hashTable[i]; j++) {
  29. result.push(i);
  30. // console.log(i)
  31. }
  32. }
  33. }
  34. return result;
  35. }
  36. console.log('countSort', countSort([2, 3, 11, 6, -3]));

插入排序(待更新)

希尔排序(待更新)

基数排序(待更新)

堆排序(待更新)

时间空间复杂度

排序算法 时间复杂度(平均) 空间复杂度
冒泡排序 O(x^2) O(1)
选择排序 O(x^2) O(1)
快速排序 O(nlog2n) O(nlog2n)
归并排序 O(nlog2n) O(n)
计数排序 O(n + (max-min)) O(n+(max-min))