# 基本排序算法

基本排序算法分为:冒泡排序,选择排序,插入排序。

  • 三种排序算法都是嵌套循环,故最坏的时间复杂度为 O(n²)。
  • 选择排序是不稳定排序,数组中如果有相同的元素,交换后的位置可能不一致。

# 冒泡排序

它是最慢的排序算法之一,数据值会像气泡一样从数组的一端漂浮到另一端。

冒泡排序

function bubbleSort() {
  const arrayLength = this.dataSource.length;
  for (var outer = 1; outer < arrayLength; outer++) {
    for (var inner = 1; inner <= arrayLength - outer; inner++) {
      if (this.dataSource[inner - 1] > this.dataSource[inner]) {
        this.swap(inner, inner - 1);
      }
    }
  }
}
1
2
3
4
5
6
7
8
9
10

# 选择排序

从数组的开头开始,将第一个元素和其他元素比,较最小的元素会被放到数组的第一个位置,再从第二个位置继续。

选择排序

function selectSort() {
  var min;
  for (var outer = 0; outer < this.dataSource.length - 2; outer++) {
    min = outer;
    for (var inner = outer + 1; inner <= this.dataSource.length - 1; inner++) {
      if (this.dataSource[inner] < this.dataSource[min]) {
        min = inner;
      }
    }
    this.swap(outer, min);
  }
}
1
2
3
4
5
6
7
8
9
10
11
12

# 插入排序

类似于人们按数组或字母顺序对数据进行排序,后面的要为前面腾位置(叠卷子)。

插入排序

function insertSort() {
  var temp, inner;
  for (var outer = 1; outer < this.dataSource.length; outer++) {
    temp = this.dataSource[outer];
    inner = outer;
    while (inner > 0 && this.dataSource[inner - 1] >= temp) {
      this.dataSource[inner] = this.dataSource[inner - 1];
      inner--;
    }
    this.dataSource[inner] = temp;
  }
}
1
2
3
4
5
6
7
8
9
10
11
12

# 测试代码

class SortArray {
  constructor(array) {
    this.dataSource = array;
  }
  //冒泡排序
  bubbleSort() {
    const arrayLength = this.dataSource.length;
    for (var outer = 1; outer < arrayLength; outer++) {
      for (var inner = 1; inner <= arrayLength - outer; inner++) {
        if (this.dataSource[inner - 1] > this.dataSource[inner]) {
          this.swap(inner, inner - 1);
        }
      }
    }
  }
  //选择排序
  selectSort() {
    var min;
    for (var outer = 0; outer < this.dataSource.length - 2; outer++) {
      min = outer;
      for (
        var inner = outer + 1;
        inner <= this.dataSource.length - 1;
        inner++
      ) {
        if (this.dataSource[inner] < this.dataSource[min]) {
          min = inner;
        }
      }
      this.swap(outer, min);
    }
  }
  //插入排序
  insertSort() {
    var temp, inner;
    for (var outer = 1; outer < this.dataSource.length; outer++) {
      temp = this.dataSource[outer];
      inner = outer;
      while (inner > 0 && this.dataSource[inner - 1] >= temp) {
        this.dataSource[inner] = this.dataSource[inner - 1];
        inner--;
      }
      this.dataSource[inner] = temp;
    }
  }

  swap(index1, index2) {
    var tmp = this.dataSource[index1];
    this.dataSource[index1] = this.dataSource[index2];
    this.dataSource[index2] = tmp;
  }
}

var myArray = [2, 3, 1, 9, 6, 4, 7, 8, 5];
console.log("原始数组:", myArray);
var s1 = new SortArray(myArray);
var s2 = new SortArray(myArray);
var s3 = new SortArray(myArray);
s1.bubbleSort();
s2.selectSort();
s3.insertSort();
console.log("冒泡排序后的数组:", s1.dataSource);
console.log("选择排序后的数组:", s1.dataSource);
console.log("插入排序后的数组:", s1.dataSource);
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
56
57
58
59
60
61
62
63
64
Last Updated: 7/19/2019, 11:39:19 PM