当前位置:   article > 正文

排序算法之堆排序--Java语言_堆排序java

堆排序java

堆排序算法首先将所有元素(从未排序的数组)插入堆中,然后从堆的根节点依次删除,直到堆空为止。本文主要利用现有数组进行就地排序,具体做法是,当删除一个元素时,只是将数组中的第一个元素与最后一个元素交换位置而不是移除,同时减小堆的大小,即数组大小,然后再对第一个元素进行堆化。持续这个过程直到剩余元素为1.

在数组中直接进行堆排序,需要知道几个参数,即最后一个元素的位置是i=count-1,count为数组大小,则最后一个元素的双亲位置为(count-1)/2。任意一个节点j的左子节点位置l=2*j+1,右子节点位置r=2*j+2.

代码:

  1. public class HeapSort {
  2. public static void swap(int[] data,int i,int j)
  3. {
  4. if(i==j)
  5. return;
  6. data[i]=data[i]+data[j];
  7. data[j]=data[i]-data[j];
  8. data[i]=data[i]-data[j];
  9. }
  10. public static int[] heapSort(int[] data)
  11. {
  12. for(int i=0;i<data.length;i++)//控制堆大小。
  13. {
  14. //每次遍历创建最大堆,并且将堆顶元素放至最后一个,并将遍历的最后一位位置逐个左移。
  15. createMaxHeap(data,data.length-1-i);//堆化
  16. swap(data,0,data.length-1-i);//交换第一个元素与最后一个元素,即获取当前最大值
  17. print(data);
  18. }
  19. return data;
  20. }
  21. public static void createMaxHeap(int[] data,int lastIndex)
  22. {
  23. for(int i=(lastIndex-1)/2;i>=0;i--)
  24. {
  25. //保存当前正在判断的节点
  26. int k=i;
  27. //若当前节点存在
  28. while(2*k+1<=lastIndex)
  29. {
  30. //biggerIndex总是记录较大节点的值,先赋值为当前判断节点的左子节点
  31. int biggerIndex=2*k+1;
  32. if(biggerIndex<lastIndex)
  33. {
  34. //若右子节点存在,否则此时biggerIndex应该等于lastIndex
  35. if(data[biggerIndex]<data[biggerIndex+1])
  36. {
  37. //若右子节点值比左子节点值大,则biggerIndex记录的是右子节点的值
  38. biggerIndex++;
  39. }
  40. }
  41. if(data[k]<data[biggerIndex])
  42. {
  43. //若当前节点值比子节点最大值小,则交换两者的值,交换后将biggerIndex值赋给k
  44. swap(data,k,biggerIndex);
  45. k=biggerIndex;
  46. }
  47. else
  48. break;
  49. }
  50. }
  51. }
  52. public static void print(int[] data)
  53. {
  54. for(int i=0;i<data.length;i++)
  55. System.out.print(data[i]+" ");
  56. System.out.println();
  57. }
  58. public static void main(String[] args)
  59. {
  60. int[] data= {89, 66, 39, 78, 40, 56, 3, 13, 20, 95};
  61. System.out.println("堆排序的序列变化:");
  62. int[] ans=heapSort(data);
  63. System.out.println("堆排序后的序列:");
  64. for(int i=0;i<data.length;i++)
  65. System.out.print(data[i]+" ");
  66. }
  67. }
测试结果:

  1. 堆排序的序列变化:
  2. 40 89 56 78 66 39 3 13 20 95
  3. 20 78 56 40 66 39 3 13 89 95
  4. 13 66 56 40 20 39 3 78 89 95
  5. 3 40 56 13 20 39 66 78 89 95
  6. 3 40 39 13 20 56 66 78 89 95
  7. 3 20 39 13 40 56 66 78 89 95
  8. 13 20 3 39 40 56 66 78 89 95
  9. 3 13 20 39 40 56 66 78 89 95
  10. 3 13 20 39 40 56 66 78 89 95
  11. 3 13 20 39 40 56 66 78 89 95
  12. 堆排序后的序列:
  13. 3 13 20 39 40 56 66 78 89 95

堆排序主要是堆化的过程,堆化过程中的时间复杂度为O(nlogn),所以堆排序的时间复杂度为O(nlogn)。堆排序是一种就地排序,不需要额外的辅助空间,同时由于在堆化的过程中,元素比较交换次数较多,排序算法不稳定。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/67410
推荐阅读
相关标签
  

闽ICP备14008679号