大根堆---堆排序

这篇博客详细介绍了如何使用Java实现堆排序算法。首先通过`BuildMaxHeap`方法构建最大堆,然后通过`HeapAdjust`进行调整,最后在`HeapSort`中完成整个排序过程。堆排序是一种效率较高的比较排序算法,适用于大数据量的排序场景。

    class Solution {

 

    public int[] sortArray(int[] nums) {
     //堆排序
         int len=nums.length;
         HeapSort(nums,len);
         return nums;
    }
    void HeapSort(int nums[],int len)
    {
        BuildMaxHeap(nums,len);
        for(int i = len-1;i>=0;i--){
            int temp ;
            temp = nums[0];
            nums[0]= nums[i];
            nums[i]=temp;  
            HeapAdjust(nums,0,i);
        }
    }
     void BuildMaxHeap(int nums[],int len){
         for(int i = (len/2)-1;i>=0;i--){
            HeapAdjust(nums,i,len);
            
          }
     }
     void HeapAdjust(int nums[],int k,int len){
          int temp = nums[k];
         for(int i = (2*k)+1; i<=len-1; i=(i*2)+1 ){
             if( i < len-1 && nums[i]<nums[i+1])
                      i++;
                if(temp >nums[i])
                     break;
                else{
                    nums[k]=nums[i];
                        k=i;
                }
                
          }
              
### 原理 大根堆和小根堆都属于二叉堆,是完全二叉树。大根堆满足父节点比子节点都大,根节点是子树中最大元素;小根堆则是父节点比子节点都小,根节点是子树中最小元素[^2]。 堆排序是基于大根堆(或小根堆)实现的排序算法。以大根堆实现升序排序为例,每次将堆顶元素(最大值)与堆的最后一个元素交换,然后调整剩余元素形成新的大根堆,重复此过程直到整个数组有序。小根堆实现降序排序的原理类似,每次将堆顶元素(最小值)与堆的最后一个元素交换,再调整剩余元素形成新的小根堆[^1][3]。 ### 实现 以下是使用Python实现大根堆升序排序的示例代码: ```python def heapify(arr, n, i): largest = i l = 2 * i + 1 r = 2 * i + 2 if l < n and arr[i] < arr[l]: largest = l if r < n and arr[largest] < arr[r]: largest = r if largest != i: arr[i], arr[largest] = arr[largest], arr[i] heapify(arr, n, largest) def heapSort(arr): n = len(arr) for i in range(n // 2 - 1, -1, -1): heapify(arr, n, i) for i in range(n - 1, 0, -1): arr[i], arr[0] = arr[0], arr[i] heapify(arr, i, 0) return arr arr = [12, 11, 13, 5, 6, 7] sorted_arr = heapSort(arr) print(sorted_arr) ``` 若要实现小根堆降序排序,只需修改`heapify`函数中比较大小的方向。 ### 应用 堆排序算法常用于大规模数据的排序,如工业制造中的数据采集和处理、科学计算中的海量数据分析等。大根堆排序适合需要找出最大值或进行升序排列的场景;小根堆排序则适用于需要找出最小值或进行降序排列的场景。此外,优先队列通常采用堆数据结构来实现,在优先队列中,大根堆可保证每次取出的元素是最大优先级的,小根堆则保证每次取出的是最小优先级的元素[^1][4]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值