原理

  • 首先建立大顶堆,然后将堆顶的元素取出,作为最大值,与数组尾部的元素交换,并维持残余堆的性质
  • 再将堆顶的元素,作为次大值,与数组倒数第二维元素交换,并维持残余堆的性质
  • 以此类推,进行n-1次操作后,数组完成了排序

    性质

  • 稳定性:和选择排序一样交换位置,故不稳定

  • 时间复杂度:均为堆排序 - 图1

代码

  1. public void heap_sort(int[] a) {
  2. //堆化
  3. for (int i = (a.length - 1 - 1) / 2; i >= 0; i--) {
  4. sift_down(a, i, a.length - 1);
  5. }
  6. //交换元素,再对刚刚交换的元素进行堆化
  7. for (int i = a.length - 1; i > 0; i--) {
  8. int tmp = a[0];
  9. a[0] = a[i];
  10. a[i] = tmp;
  11. sift_down(a, 0, i - 1);
  12. }
  13. }
  14. void sift_down(int[] arr, int start, int end) {
  15. int parent = start;
  16. int child = parent * 2 + 1;
  17. while (child <= end) {
  18. if (child + 1 <= end && arr[child] < arr[child + 1]) {
  19. child++;
  20. }
  21. if (arr[parent] >= arr[child]) {
  22. return;
  23. } else {
  24. int tmp = arr[parent];
  25. arr[parent] = arr[child];
  26. arr[child] = tmp;
  27. parent = child;
  28. child = parent * 2 + 1;
  29. }
  30. }
  31. }