交换数据元素

  1. function swap(arr, i, j) {
  2. [arr[i], arr[j]] = [arr[j], arr[i]]
  3. return arr;
  4. }

冒泡排序

  1. function sort_bubbling(arr, desc) {
  2. if(!Array.isArray(arr)) throw 'input must an array';
  3. if(arr.length <= 1) return arr;
  4. let len = arr.length;
  5. for(let i = 0; i < len; i ++) {
  6. for(let j = 0 ; j < len - 1 - i; j++) {
  7. if(arr[i] < arr[j]){
  8. swap(arr, i , j);
  9. }
  10. }
  11. }
  12. return arr
  13. }

选择排序

  1. function sort_select(arr, desc) {
  2. if(!Array.isArray(arr)) throw 'input must an array';
  3. if(arr.length <= 1) return arr;
  4. let len = arr.length;
  5. for(let i = 0; i < len - 1; i ++) {
  6. let minIndex = i;
  7. for(let j = i +1; j < len; j++) {
  8. if(arr[j] < arr[minIndex]) minIndex = j;
  9. }
  10. swap(arr, i ,j);
  11. }
  12. return arr
  13. }

插入排序

  1. function sort_insert(arr, desc) {
  2. if(!Array.isArray(arr)) throw 'input must an array';
  3. if(arr.length <= 1) return arr;
  4. let len = arr.length;
  5. for(let i = 1; i < len; i ++) {
  6. let j = i,temp = arr[i];
  7. while(j > 0 && arr[j] > temp) {
  8. arr[j] = arr[j - 1];
  9. j --;
  10. }
  11. arr[j] = temp;
  12. }
  13. return arr
  14. }

归并排序

自顶向下

  1. function merge(left, right) {
  2. let result = [];
  3. while(left.length && right.length) {
  4. if(left[0] < right[0]) {
  5. result.push(left.shift());
  6. } else {
  7. result.push(right.shift());
  8. }
  9. }
  10. while(left.length) {
  11. result.push(left.shift());
  12. }
  13. while(right.length) {
  14. result.push(right.shift());
  15. }
  16. return result;
  17. }
  18. function sort_merge(arr) {
  19. if(!Array.isArray(arr)) throw 'input must an array';
  20. if(arr.length <= 1) return arr;
  21. let middle = parseInt(arr.length/2);
  22. let left = arr.slice(0, middle);
  23. let right = arr.slice(middle);
  24. return merge(sort_merge(left), sort_merge(right));
  25. }

自底向上

  1. function sort_merge(arr) {
  2. if(!Array.isArray(arr)) throw 'input must an array';
  3. if(arr.length <= 1) return arr;
  4. }

快速排序

  1. // by ruanyifeng
  2. function sort_quick(arr) {
  3. if(!Array.isArray(arr)) throw 'input must an array';
  4. if(arr.length <= 1) return arr;
  5. let middle = parseInt(arr.length/2);
  6. let left = [], right = [], pointV = arr.splice(middle,1)[0];
  7. for(let i = 0; i < arr.length; i ++) {
  8. if(arr[i] < pointV) {
  9. left.push(arr[i]);
  10. } else {
  11. right.push(arr[i]);
  12. }
  13. }
  14. return sort_quick(left).concat([pointV], sort_quick(right));
  15. }

阮一峰写的快排会造成空间浪费,还是要在理解快排思想的情况下再做优化

  1. // 升序
  2. function sort_quick(arr) {
  3. if (!Array.isArray(arr)) throw 'input must be an arrray'
  4. function sort(arr, left=0, right=arr.length - 1) {
  5. let flag = arr[0]
  6. let i = left;
  7. let j = right;
  8. while(i < j) {
  9. while (arr[j] < flag && j > i) {
  10. j --
  11. }
  12. while (arr[i] > flag && i < j) {
  13. i ++
  14. }
  15. swap(arr, i, j);
  16. }
  17. if (arr[i] < flag) swap(arr, 0, i);
  18. sort(arr, 0, i-1);
  19. sort(arr, i, arr.length - 1);
  20. return arr;
  21. }
  22. }