堆排序代码

//先给一个从下标0开始的堆排序

#include<iostream>

#include <vector>

#include "math.h"

using namespace std;

void heapAdjust(vector<int> &v,int i,int size)

{

    int leftChild=i*2+1;

    int rightChild=i*2+2;

    int max=i;

    if (i<=(size/2)) {

        if (leftChild<=size&&v[leftChild]>v[max]) {

            max=leftChild;

        }

        if (rightChild<=size&&v[rightChild]>v[max]) {

            max=rightChild;

        }

        if (i!=max) {

            swap(v[i], v[max]);

            heapAdjust(v, max, size);

        }

    }

}

void heapSort(vector<int> &v)

{

    int n=v.size();

    for (int i=(n-1)/2; i>=0; i--) {

        heapAdjust(v,i,n-1);

    }

    for (int i=n-1; i>=0; i--) {

        swap(v[0],v[i]);

        heapAdjust(v, 0, i-1);

    }

}

int main()

{

    vector<int> v={0,4,3,7,6,2,1,5,8};

//    int size=v.size();

    heapSort(v);

    for(int x:v)

        cout<<x<<" ";

    return 0;

}


//这个是网上找的下表从1开始的堆排序

#include<iostream>

#include <vector>

#include "math.h"

using namespacestd;

void HeapAdjust( vector<int> &a,int i,int size)  //调整堆

{

    int lchild=2*i;      //i的左孩子节点序号

    int rchild=2*i+1;    //i的右孩子节点序号

    int max=i;           //临时变量

    if(i<=size/2)         //如果i不是叶节点就不用进行调整

    {

        if(lchild<=size&&a[lchild]>a[max])

        {

            max=lchild;

        }

        if(rchild<=size&&a[rchild]>a[max])

        {

            max=rchild;

        }

        if(max!=i)

        {

            swap(a[i],a[max]);

            HeapAdjust(a,max,size);   //避免调整之后以max为父节点的子树不是堆

        }

    }

}


void BuildHeap(vector<int> &a,int size)    //建立堆

{

    int i;

    for(i=size/2;i>=1;i--)   //非叶节点最大序号值为size/2

    {

        HeapAdjust(a,i,size);

    }

}


void HeapSort(vector<int> &a,int size)    //堆排序

{

    int i;

    BuildHeap(a,size);

    for(i=size;i>=1;i--)

    {

        //cout<<a[1]<<" ";

        swap(a[1],a[i]);           //交换堆顶和最后一个元素,即每次将剩余元素中的最大者放到最后面

        //BuildHeap(a,i-1);        //将余下元素重新建立为大顶堆

        HeapAdjust(a,1,i-1);     //重新调整堆顶节点成为大顶堆

    }

}

int main()

{

    vector<int> v={0,4,3,7,2,5};

//    int size=v.size();

    HeapSort(v,5);

    for(int x:v)

        cout<<x<<" ";

    return0;

}


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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值