【刷题之路】堆排序

经典算法

class HeapSort {
public:
    int* heapSort(int* A, int n) {
        // write code her
        maxheap(A,n);
        for(int i=n-1;i>=0;i--){
            swap(A[0],A[i]); //大根堆堆顶元素为堆中最大的,将堆顶元素移到数组尾部,并且将最后一个元素移过来,重新调整(n-1)个数的大根堆
            fixdown(A,0,i);
        }
        return A;


    }
        void maxheap(int num[],int n) //建立大根堆,从倒数第一个父节点开始调整


            int i;
            for(i=n/2-1;i>=0;i--){
                fixdown(num,i,n-1);
            }
        }
        void fixdown(int nums[],int i,int n) //堆调整

{
            int j,temp;
            int flag=1;
            while(2*i+1<n && flag)

{
                if(2*i+2>n-1) j=2*i+1; //首先选择头结点的两个子节点中较大的一个
                else if(nums[2*i+1]<nums[2*i+2] && i*2+2< n) j=2*i+2;
                else j=2*i+1;
                if(nums[i]<nums[j]) //如果头结点小于较大节点,则交换位置,因为之前的位置是调整好的,所以只需要调整num[i]即可,重复操作直到新加入节点下沉到一个合适的位置

{
                    temp=nums[i];
                    nums[i]=nums[j];
                    nums[j]=temp;
                    i=j;
                }
                else flag=0;
            }
  
        }
};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值