# 排序算法

# 冒泡排序

function bubbleSort(arr) {
    for(var i = 0, len = arr.length - 1; i < len; i++) {
        for(var j = i + 1, l = arr.length; j < l; j++) {
            if (arr[i] > arr[j]) {
                var item = arr[i];
                arr[i] = arr[j];
                arr[j] = item;
            }
        }
    }
    return arr;
}

const data = [3,2,5,1,7,9];

bubbleSort(data);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

# 插入排序

function insertSort(arr) {
    var inner;
    for(var i = 1, len = arr.length; i < len; i++) {
        var temp = arr[i];
        inner = i;
        while(inner > 0 && arr[inner - 1] >= temp) {
            arr[inner] = arr[inner - 1];
            inner--;
        }
        arr[inner] = temp;
    }
    return arr;
}

const data = [3,2,5,1,7,9];

insertSort(data);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

# 选择排序

function selectSort(arr) {
    for(var i = 0, len = arr.length - 1; i < len; i++) {
        var min = i;
        for(var j = i +1, l = arr.length; j < l; j++) {
            min = arr[j] < arr[min] ? j : min;
        }
        if (arr[min] < arr[i]) {
            var item = arr[i];
            arr[i] = arr[min];
            arr[min] = item;
        }
    }
    return arr;
}

const data = [3,2,5,1,7,9];

selectSort(data);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

# 希尔排序

function shellSort(array) {
  // 定义间隔序列,这里写死了,可以动态定义
  const gaps = [5, 3, 1];
  for (let index = 0; index < gaps.length; index++) {
    const gap = gaps[index];

    for (let outer = gap; outer < array.length; outer++) {
      // 检查的数字
      const temp = array[outer];
      for (
        let inner = outer - gap;
        // 如果比之前的 gap 小,就交换一下,直到交换到第一个 gap 处
        inner >= 0 && array[inner] > temp;
        inner -= gap
      ) {
        swap(array, inner, inner + gap);
      }
    }
  }
  return array;
}

function swap(array, index1, index2) {
  var temp = array[index1];
  array[index1] = array[index2];
  array[index2] = temp;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27

# 快速排序

function qSort(list) {
  if (list.length == 0) {
    return [];
  }
  var pivot = list[0];
  var lesser = [];
  var greater = [];
  for (var i = 1; i < list.length; i++) {
    if (list[i] < pivot) {
      lesser.push(list[i]);
    } else {
      greater.push(list[i]);
    }
  }
  return qSort(lesser).concat(pivot, qSort(greater));
}
var myArray = [2, 3, 1, 9, 6, 4, 7, 8, 5];
var arr = qSort(myArray);
console.log(arr);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

# 归并排序

// 归并排序算法
function mergeSort(array) {
  // 避免污染传入的数组
  const temp = [...array];
  splitArray(temp, 0, array.length - 1);
  return temp;
}

// 将大数组拆分成两个小数组
function splitArray(array, start, end) {
  if (start < end) {
    const mid = Math.floor((start + end) / 2);
    splitArray(array, 0, mid);
    splitArray(array, mid + 1, end);
    mergeArray(array, start, mid, end);
  }
}

// 合并两个排序好的数组
function mergeArray(array, start, mid, end) {
  var i = start;
  var j = mid + 1;
  var k = 0;
  var temp = [];
  while (i <= mid && j <= end) {
    if (array[i] <= array[j]) {
      temp[k] = array[i];
      i++;
    } else {
      temp[k] = array[j];
      j++;
    }
    k++;
  }

  while (i <= mid) {
    temp[k] = array[i];
    i++;
    k++;
  }

  while (j <= end) {
    temp[k] = array[j];
    j++;
    k++;
  }

  for (let index = 0; index < k; index++) {
    array[index + start] = temp[index];
  }
}
var arr = [2, 3, 7, 9, 8, 5, 4, 6, 1];
console.log('原始数组:', arr);
const result = mergeSort(arr);
console.log('排列后数组:', result);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55