公用的数据

1
var nums = [4, 2, 16, 12, 32, 21, 33, 1];

array.sort

1
2
3
4
5
6
7
8
9
nums.sort(function(a, b) {
  if (a < b) {
    return -1;
  }
  if (a > b) {
    return 1;
  }
  return 0;
});

冒泡排序

依次交换相邻的两个数字的顺序(大的在后),这样交换一次之后,最大的就在后面了,再交换一变,最大的两个数在后面的…

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
function bubbleSort(arr) {
  var len = arr.length;
  for (var i = 0; i < len; i++) {
    for (var j = 0; j < len - i - 1; j++) {
      if (arr[j] > arr[j + 1]) {
        [arr[j], arr[j + 1]] = [arr[j + 1], arr[j]];
      }
    }
  }
}

选择排序

将剩余数据最小的放在开始,再奖剩余数据最小的放在第二位…

和冒泡排序的区别,冒泡:两两交换。选择:剩余最小的交换到剩余数的最前面

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
function selectSort(arr) {
  var len = arr.length;
  for (var i = 0; i < len - 1; i++) {
    var min = i;
    for (var j = i + 1; j < len; j++) {
      if (arr[j] < arr[min]) {
        [arr[min], arr[j]] = [arr[j], arr[min]];
      }
    }
  }
}

插入排序

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
function insertSort(arr) {
  var len = arr.length;
  for (var i = 1; i < len; i++) {
    var key = arr[i];
    var j = i - 1;
    while (j >= 0 && arr[j] > key) {
      arr[j + 1] = arr[j];
      j--;
    }
    arr[j + 1] = key;
  }
}

归并排序

是一种分治算法

假设数据有 n 个,先对 n/2 组数进行排序,再对 n/4 组书进行排序…直到 n/m 等于 1 的时候

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
function merge(left, right) {
  var result = [];
  while (left.length > 0 && right.length > 0) {
    if (left[0] < right[0]) {
      result.push(left.shift());
    } else {
      result.push(right.shift());
    }
  }
  return result.concat(left, right);
}

function mergeSort(arr) {
  if (arr.length <= 1) return arr;
  var mid = Math.floor(arr.length / 2);
  var left = arr.slice(0, mid);
  var right = arr.slice(mid);
  return merge(mergeSort(left), mergeSort(right));
}

快速排序

以第一个数为基准值,大于基准值的放右边,小于基准值的放左边,然后递归处理左边的数据和右边的数据

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
function quickSort(arr) {
  var len = arr.length;
  var basic = arr[0];
  var left = [];
  var right = [];
  for (var i = 1; i < len; i++) {
    var iv = arr[i];
    iv >= basic && right.push(iv); // to avoid repeatly element.
    iv < basic && left.push(iv);
  }
  return quickSort(left).concat(basic, quickSort(right));
}