升序排列数组

  1. function heapify(arr, idx, len) {
  2. let maxPoint = idx;
  3. const left = idx * 2 + 1;
  4. const right = idx * 2 + 2;
  5. if (left < len && arr[left] > arr[maxPoint]) {
  6. maxPoint = left;
  7. }
  8. if (right < len && arr[right] > arr[maxPoint]) {
  9. maxPoint = right;
  10. }
  11. if (maxPoint !== idx) {
  12. [arr[idx], arr[maxPoint]] = [arr[maxPoint], arr[idx]];
  13. heapify(arr, maxPoint, len);
  14. }
  15. }
  16. function heapSort(arr) {
  17. let len = arr.length;
  18. for (let i = Math.floor(len / 2) - 1; i >= 0; i--) {
  19. heapify(arr, i, len);
  20. }
  21. while (--len) {
  22. [arr[0], arr[len]] = [arr[len], arr[0]];
  23. heapify(arr, 0, len);
  24. }
  25. return arr;
  26. }

算法测试

  1. console.log(heapSort([6, 2, 1, 8, 7, 5]));
  2. // [ 1, 3, 5, 6, 8, 9 ]
  3. console.log(heapSort([4, 7, 2, 5, 3, 1, 9, 0]));
  4. // [ 0, 1, 2, 3, 4, 5, 7, 9 ]
  5. console.log(heapSort([12, 0, 3, 4, 3, 8]));
  6. // [ 0, 3, 3, 4, 8, 12 ]