# 简单排序

# 冒泡排序

每个元素进行冒泡比较,将最大元素移动到最后。一次递减比较元素个数,最终完成排序。

添加 flat 标记,当进行一边循环检测后没有元素进行更改,则证明所有元素已经排序好了,无需再进行后续循环。

// 注意将直接修改传入的数组 elements
function bubble_sort<T>(elements: T[], n: number) {
  // 递减进行循环,因为每次最后一个元素都是已经处理好的数据
  for (let P = n - 1; P >= 0; P--) {
    let flag = 0;
    // 循环移动前后最大值位置
    for (let i = 0; i < P; i++) {
      if (elements[i] > elements[i + 1]) {
        // 交换前后元素
        const swap = elements[i];
        elements[i] = elements[i + 1];
        elements[i + 1] = swap;

        // 修改标记
        flag = 1;
      }
    }
    if (flag === 0) break;
  }
}

let data = [1, 2, 3, 5, 233, 4, 32, 12, 85, 23];

bubble_sort(data, data.length);
console.log(data);

// output: [ 1, 2, 3, 4, 5, 12, 23, 32, 85, 233 ]

# 插入排序

每次取出一个元素循环向后比较,满足条件元素向后移动一个位置,直到最后取出元素插入对应位置为止

// 注意,直接对elements 数组进行排序
function insert_sort<T>(elements: T[], n: number) {
  for (let P = 1; P < n; P++) {
    let tmp = elements[P];
    let i = P;
    // 每次比tmp 元素大的元素都要往后移动一格,直到最后tmp插入正确位置
    for (; i > 0 && elements[i - 1] > tmp; i--) {
      elements[i] = elements[i - 1];
    }
    elements[i] = tmp;
  }
}

let data = [1, 2, 3, 5, 233, 4, 32, 12, 85, 23];

insert_sort(data, data.length);
console.log(data);

// output:[ 1, 2, 3, 4, 5, 12, 23, 32, 85, 233 ]

# 希尔排序

  • Dm = N /2, Dk = Dk+1 /2

给定一个增量序列,对增量序列索引进行排序。最后增量序列递减至 1 依次排序。

增量序列在插入排序基础上,通过给定增量进行索引值排序,降低了插入序列的遍历次数。

# Hibbard 增量序列

# Sedgewick 增量序列

# 堆排序

将数据构建一个最大堆,每次将最大值与最后一个值替换,这样就排好了一个最大值。依次缩小最大堆规模(每次剔除排好的最大值)。

// 构建最大堆
function buildHeap<T>(elements: T[], length: number) {
  for (let i = length - 1; i > 0; i--) {
    let pIndex = Math.floor(i / 2);
    for (let cIndex = pIndex; pIndex * 2 < length; pIndex = cIndex) {
      cIndex = Math.floor(pIndex * 2);
      if (elements[cIndex] < elements[cIndex + 1] && cIndex + 1 < length)
        cIndex++;
      if (elements[cIndex] > elements[pIndex]) {
        const swap = elements[cIndex];
        elements[cIndex] = elements[pIndex];
        elements[pIndex] = swap;
      }
    }
  }
}

function heap_sort<T>(elements: T[], length: number) {
  // 每次剔除最大值重建堆
  for (let i = length; i > 1; i--) {
    buildHeap(elements, i);
    console.log(elements);
    const tmp = elements[0];
    elements[0] = elements[i - 1];
    elements[i - 1] = tmp;
  }
}

let data: number[] = [1, 2, 3, 8, 12, 28, 123, 80, 50, 43, 68, 100];

heap_sort(data, data.length);
console.log(data);

/* output
[ 123, 100, 68, 80, 50, 28, 8, 2, 12, 43, 3, 1 ]
[ 100, 80, 68, 8, 50, 28, 1, 2, 12, 43, 3, 123 ]
[ 80, 68, 50, 8, 43, 28, 1, 2, 12, 3, 100, 123 ]
[ 68, 50, 43, 8, 12, 28, 1, 2, 3, 80, 100, 123 ]
[ 50, 43, 28, 8, 12, 3, 1, 2, 68, 80, 100, 123 ]
[ 43, 28, 12, 8, 2, 3, 1, 50, 68, 80, 100, 123 ]
[ 28, 12, 3, 8, 2, 1, 43, 50, 68, 80, 100, 123 ]
[ 12, 8, 3, 1, 2, 28, 43, 50, 68, 80, 100, 123 ]
[ 8, 3, 2, 1, 12, 28, 43, 50, 68, 80, 100, 123 ]
[ 3, 2, 1, 8, 12, 28, 43, 50, 68, 80, 100, 123 ]
[ 2, 1, 3, 8, 12, 28, 43, 50, 68, 80, 100, 123 ]
[ 1, 2, 3, 8, 12, 28, 43, 50, 68, 80, 100, 123 ]
*/

# 归并排序

将数据进行二分递归排序,结果合并在一起,最大达到目的。

上次更新: 8/21/2020, 3:56:52 PM