堆排序是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子节点的健值或索引总是小于 (或大于) 它的父节点。堆排序可以说是一种利用堆的概念来排序的选择排序。分为两种方法:

  1. 大顶堆:每个节点的值都大于或等于其子节点的值,在堆排序算法中用于升序排列;
  2. 小顶堆:每个节点的值都小于或等于其子节点的值,在堆排序算法中用于降序排列;

实现步骤

  1. 创建一个堆 H[0……n-1];
  2. 把堆首 (最大值) 和堆尾互换;
  3. 把队的尺寸缩小为 1,并调用 shift_down(0),目的是把新的数组顶端数据调整到相应位置;
  4. 重复步骤2,直到堆的尺寸为 1;

动图演示

heapSort.gif

Sorting_heapsort_anim.gif

JavaScript 代码实现

  1. let len;
  2. function buildMaxHeap(arr) {
  3. let = arr.length;
  4. for (let i = Math.floor(len / 2); i >=0; i--) {
  5. heapify(arr, i);
  6. }
  7. }
  8. function heapify(arr, i) {
  9. let left = 2 * i + 1,
  10. right = 2 * i + 2,
  11. largest = i;
  12. if (left < len && arr[left] > arr[largest]) {
  13. largest = left;
  14. }
  15. if (right < len && arr[right] > arr[largest]) {
  16. largest = right;
  17. }
  18. if (largest != i) {
  19. swap(arr, i, largest);
  20. heapify(arr, largest);
  21. }
  22. }
  23. function swap(arr, i, j) {
  24. const temp = arr[i];
  25. arr[i] = arr[j];
  26. arr[j] = temp;
  27. }
  28. function heapSort(arr) {
  29. buildMaxHeap(arr);
  30. for (let i = arr.length - 1; i > 0; i--) {
  31. swap(arr, 0, i);
  32. len--;
  33. heapify(arr, 0)
  34. }
  35. return arr;
  36. }