堆排序代码

来源:互联网 发布:java初级工程师面试 编辑:程序博客网 时间:2024/06/08 07:25

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

#include<iostream>

#include <vector>

#include "math.h"

using namespacestd;

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<<" ";

    return0;

}


//这个是网上找的下表从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 0