1. /**
  2. * 22.实现堆排序
  3. *
  4. * */
  5. public class HeapSort
  6. {
  7. private static int[] a = null;
  8. public Test_22(int k)
  9. {
  10. a = new int[k];
  11. for (int i = 0; i < a.length; i++)
  12. {
  13. int temp = (int) (Math.random() * 100);
  14. System.out.print(temp + " ");
  15. a[i] = temp;
  16. }
  17. System.out.println();
  18. swap(a, 1, 2);
  19. System.out.println(Arrays.toString(a));
  20. }
  21. public static void main(String[] args)
  22. {
  23. Test_22 test = new Test_22(22);
  24. test.deepsort(a, 0, 21);
  25. System.out.println(Arrays.toString(a));
  26. }
  27. private void deepsort(int[] a, int star, int end)
  28. {
  29. // 1,建堆,大顶堆
  30. // 2.排队,即把堆顶大数移动到数组后面位置
  31. for (int i = 0; i < a.length - 1; i++)
  32. {
  33. buildDeep(a, a.length - i);
  34. swap(a, 0, a.length - 1 - i);
  35. }
  36. }
  37. static private void buildDeep(int[] a, int length)
  38. {// 堆的高度
  39. // 从尾巴开始比较,定义一个指针 指向最后的父亲节点
  40. // 首先,2个叶子比较,然后大的叶子和父亲节点比较,如果父亲大 则不操作 指针向前面走一位
  41. // 如果子节点比父亲大 父亲与子节点交换 指针指向该交换后的子节点位子
  42. // 當指針指向根位子的前一個位子 則退出循環
  43. int p = (length - 2) / 2;
  44. while (p >= 0)
  45. {
  46. // 如果左子节点存在
  47. while (p * 2 + 1 < length)
  48. {// 默认左子节点是最大的
  49. int max = p * 2 + 1;
  50. // 如果右子节点存在
  51. if ((p + 1) * 2 < length)
  52. {
  53. // 比较左右子节点
  54. if (a[(p + 1) * 2] > a[max])
  55. {
  56. max = (p + 1) * 2;
  57. }
  58. }
  59. // 比较最大子节点与父亲节点
  60. if (a[p] < a[max])
  61. {// 最大子节点与父亲节点的值交换,并且指针p指向max
  62. swap(a, max, p);
  63. p = max;
  64. } else
  65. {
  66. break;
  67. }
  68. }
  69. p--;
  70. }
  71. }
  72. /***
  73. * 数组中某2个位置的值交换
  74. *
  75. * @param a
  76. * 数组
  77. * @param star
  78. * 待交换的第一个位子
  79. * @param end
  80. * 待交换的第二个位子
  81. * */
  82. private static void swap(int[] a, int star, int end)
  83. {
  84. int temp = a[end];
  85. a[end] = a[star];
  86. a[star] = temp;
  87. }
  88. }