堆排序 java 实现

系统管理员 2021-09-28 13:20 427阅读 0赞
  1. public class HeepSort {
  2. private static void heepSort(int[] arr) {
  3. int n = arr.length;
  4. int[] a = new int[n+1];//堆排序只能从1开始,新建一个从1开始的数组
  5. for(int i = 1; i < a.length; i++) {
  6. a[i] = arr[i-1];
  7. }
  8. //建大顶堆,然后交换到最后面
  9. for(int i = n/2; i >=1; i--) {
  10. adjustHeep(a, i, n);
  11. }
  12. System.out.println("大顶堆:" + Arrays.toString(a));
  13. //n-1次交换
  14. for(int i = 1; i < n; i++) {
  15. int tem = a[1];//最大的数交换到最后面
  16. a[1] = a[n-i+1];
  17. a[n-i+1] = tem;
  18. //剩下的从根节点调整大顶堆
  19. adjustHeep(a, 1, n-i);
  20. }
  21. for(int i = 0; i < arr.length; i++) {
  22. arr[i] = a[i+1];
  23. }
  24. }
  25. private static void adjustHeep(int[] a, int k, int len) {
  26. int i = k, j = i * 2;
  27. int tem = a[i];
  28. while(j <= len) {
  29. if(j+1 <= len && a[j+1] > a[j]) {
  30. j++;//记录大的
  31. }
  32. if(tem < a[j]) {
  33. a[i] = a[j];
  34. i = j;
  35. j = i * 2;
  36. } else {
  37. break;
  38. }
  39. }
  40. a[i] = tem;
  41. }
  42. public static void main(String[] args) {
  43. int[] arr = {2, 13, 35, 12, 36, 4, 66, 93, 60};
  44. System.out.println("before:" + Arrays.toString(arr));
  45. heepSort(arr);
  46. System.out.println("after:" + Arrays.toString(arr));
  47. }
  48. }

结果:

before:[2, 13, 35, 12, 36, 4, 66, 93, 60]
大顶堆:[0, 93, 60, 66, 13, 36, 4, 35, 12, 2]
after:[2, 4, 12, 13, 35, 36, 60, 66, 93]

发表评论

表情:
评论列表 (有 0 条评论,427人围观)

还没有评论,来说两句吧...

相关阅读

    相关 java实现排序

    一、堆排序基本介绍 1. 堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选择排序,它的最坏,最好,平均时间复 杂度均为 O(nlogn),它也是不稳定...

    相关 Java实现排序

    > 堆排序(Heapsort)是指利用堆积树(堆)这种数据结构所设计的一种排序算法,它是选择排序的一种。可以利用数组的特点快速定位指定索引的元素。堆分为大根堆和小根堆,是完全二

    相关 排序java实现

    一、前言 堆是一个数组,它可以看成近似的完全二叉树。表示堆的数组包括两个属性:A.length数组元素的个数,A.heapSize表示多少个元素存在数组中。这里的关系是:

    相关 排序-Java实现

    堆排序思想 对于给定的n个数据,初始时将n维数组看成一颗二叉树,若需要从小到大排序,将其调整为小顶堆(若从大到小排序,调整为大顶堆),输出堆顶元素,然后将堆的最后一个元素