堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。
大顶堆:每个节点的值都大于或等于其子节点的值,在堆排序算法中用于升序排列;
小顶堆:每个节点的值都小于或等于其子节点的值,在堆排序算法中用于降序排列;

  1. 算法步骤
    创建一个堆 H[0……n-1];

把堆首(最大值)和堆尾互换;

把堆的尺寸缩小 1,并调用 shift_down(0),目的是把新的数组顶端数据调整到相应位置;

重复步骤 2,直到堆的尺寸为 1。

  1. public int[] sort(int[] sourceArray) throws Exception {
  2. // 对 arr 进行拷贝,不改变参数内容
  3. int[] arr = Arrays.copyOf(sourceArray, sourceArray.length);
  4. int len = arr.length;
  5. buildMaxHeap(arr, len);
  6. for (int i = len - 1; i > 0; i--) {
  7. swap(arr, 0, i);
  8. len--;
  9. heapify(arr, 0, len);
  10. }
  11. return arr;
  12. }
  13. private void buildMaxHeap(int[] arr, int len) {
  14. for (int i = (int) Math.floor(len / 2); i >= 0; i--) {
  15. heapify(arr, i, len);
  16. }
  17. }
  18. private void heapify(int[] arr, int i, int len) {
  19. int left = 2 * i + 1;
  20. int right = 2 * i + 2;
  21. int largest = i;
  22. if (left < len && arr[left] > arr[largest]) {
  23. largest = left;
  24. }
  25. if (right < len && arr[right] > arr[largest]) {
  26. largest = right;
  27. }
  28. if (largest != i) {
  29. swap(arr, i, largest);
  30. heapify(arr, largest, len);
  31. }
  32. }
  33. private void swap(int[] arr, int i, int j) {
  34. int temp = arr[i];
  35. arr[i] = arr[j];
  36. arr[j] = temp;
  37. }

参考

https://blog.csdn.net/u013384984/article/details/79496052
https://blog.csdn.net/qq_36183935/article/details/80234259