• 排序算法-堆排序


    思路

            堆排序(Heapsort)是指利用堆积树(堆)这种数据结构所设计的一种排序算法,它是选择排序的一种。它是通过堆 来进行选择数据。需要注意的是排升序要建大堆,排降序建小堆。       

            我们先将要排序的数据建成堆,然后通过下图所示的步骤进行排序

             特性总结:

            1. 堆排序使用堆来选数,效率就高了很多。

            2. 时间复杂度:O(N*logN)

            3. 空间复杂度:O(1)

            4. 稳定性:不稳定

    代码及注释

            

    1. public class HeapSort {
    2. public static void heapSort(int[]arr){
    3. //先将数组中的数据创建成堆
    4. //由于要进行升序排序,所以要创建大根堆
    5. createBigHeap(arr);
    6. //此时数组中的数据已经是大根堆了
    7. //由于大根堆堆顶的数是最大的,所以可以将堆顶的数换到数组最后,然后再将其余的数据转换为大根堆,继续同样的操作
    8. int length=arr.length;
    9. for(int i=1;i
    10. int end=length-i;
    11. swap(arr,0,end);
    12. siftDown(arr,0,end);
    13. }
    14. }
    15. private static void createBigHeap(int[]arr){
    16. //要对拥有子树的节点进行向下调整
    17. int length=arr.length;
    18. //遍历所有拥有子树的节点
    19. for(int i=(length-1-1)/2;i>=0;i--){
    20. //对父节点向下调整(用两个子树的最大值与父节点的值进行比较,如果父节点小,则交换父节点与子节点)
    21. siftDown(arr,i,length);
    22. }
    23. }
    24. //向下调整
    25. //调整根节点parent所在的树,使成为大根堆
    26. private static void siftDown(int[]arr,int parent,int end){
    27. //获得父节点parent左子树的下标child
    28. int child=parent*2+1;
    29. //child没有超过范围,表示当前的parent确实是父节点
    30. while (child
    31. //子节点和父节点交换有以下3种情况
    32. //1.没有右孩子,此时就比较左孩子与父节点的大小,左孩子大,就交换
    33. //2.有右孩子,此时比较左孩子与右孩子的大小,要是左孩子大,就比较左孩子与父节点的大小,还是左孩子大,就交换
    34. //3.有右孩子,此时比较左孩子与右孩子的大小,要是右孩子大,就比较右孩子与父节点的大小,还是右孩子大,就交换
    35. //判断child此时应该指向左孩子还是右孩子,child一开始指向的是左孩子,经过判断后,child会指向比较大的那个孩子
    36. if(child+11]){
    37. child=child+1;
    38. }
    39. //判断比较大的子孩子与父节点之间的大小关系
    40. if(arr[child]>arr[parent]){
    41. swap(arr,child,parent);
    42. }
    43. //可能交换后对于下一层的树还是不合适,就还要继续进行向下调整
    44. parent=child;
    45. child=parent*2+1;
    46. }
    47. }
    48. public static void swap(int[] arr,int m,int n) {
    49. int tmp=arr[m];
    50. arr[m]=arr[n];
    51. arr[n]=tmp;
    52. }
    53. }

  • 相关阅读:
    C语言:数据的存储
    有限责任公司法人职责有哪些
    CMake教程-第 7 步:添加系统自省功能
    健身房预约小程序开发全攻略
    基于Java毕业设计学习自律养成小程序后台源码+系统+mysql+lw文档+部署软件
    国产无线耳机什么牌子好?国产蓝牙耳机品质排行榜
    ​@Async​
    【C语言实现内核链表】
    OpenMMLab MMYOLO目标检测环境搭建(一)
    命令行工具集合busybox编译
  • 原文地址:https://blog.csdn.net/q322359/article/details/132874065