数据结构练习——堆排序

 只是把以前的写的代码贴出来而已

#ifndef HEAP_H

#define HEAP_H



void HeapSort(int* a,int arraySize);

void BuildHeap(int* a,int arraySize);

void ShiftUp(int* a, int index);

void ShiftDown(int* a,int startIndex,int endIndex);

void Swap(int& x,int& y);

void PrintHeap(int* a,int arraySize);



#endif

 

Heap.cpp

#include "Heap.h"

#include <iostream>



using std::cout;

using std::endl;



void HeapSort(int* a,int arraySize)

{

    //先建一个大根堆

    BuildHeap(a,arraySize);

    for(int i=arraySize-1;i>0;i--)

    {

        //把根结点最大的元素与最后一个叶子结点交换

        Swap(a[i],a[0]);

        //较小的叶子结点元素换到根结点后,与孩子结点比较

        //把堆恢复成大根堆,注意此时的i-1,其实已经把最大的元素

        //也就是原来的根结点排除在新的大根堆外面了

        //通过这样不断选出最大元素,最终完成从小到大的排序

        ShiftDown(a,0,i-1);

    }

}



//建大根堆

void BuildHeap(int* a,int arraySize)

{

    for(int i=0;i<arraySize;i++)

        ShiftUp(a,i);

}



//从最后一个叶子结点开始,如果比父结点大则往上移

//直至移到根结点

void ShiftUp(int* a, int index)

{

    int currNode=index;

    int parentNode=(currNode-1)/2;

    while(parentNode>=0)

    {

        if(a[currNode] > a[parentNode])

        {

            Swap(a[currNode],a[parentNode]);

            //往上移

            currNode=parentNode;

            parentNode=(parentNode-1)/2;

        }

        else

            break;

    }

}





//从根结点开始,如果比最大的孩子结点小则往下移

//直至移到最后的叶子结点

void ShiftDown(int* a,int startIndex,int endIndex)

{

    int currNode=startIndex;

    int leftChild=2*currNode+1;

    int rightChild=2*currNode+2;

    int exchangeNode;



    while(leftChild<=endIndex || rightChild<=endIndex)

    {

        //选择左右孩子中较大的一个与父结点比较

        if(rightChild<=endIndex)

            exchangeNode=a[leftChild]>a[rightChild] ? leftChild:rightChild;

        else

            exchangeNode=leftChild;



        if(a[currNode]<a[exchangeNode])

        {

            Swap(a[currNode],a[exchangeNode]);

            //往下移

            currNode=exchangeNode;

            leftChild=currNode*2+1;

            rightChild=currNode*2+2;

        }

        else

            break;

    }

}



void PrintHeap(int* a,int arraySize)

{

    for(int i=0;i<arraySize;i++)

        cout<<a[i]<<" ";

    cout<<endl;

}



void Swap(int& x,int& y)

{

    int temp=x;

    x=y;

    y=temp;

}

 

 main.cpp

#include <iostream>

#include "Heap.h"



int main()

{

    int a[10]={5,1,9,8,3,2,4,6,7,10};



    for(int i=0;i<10;i++)

        a[i]=rand();



    HeapSort(a,10);

    PrintHeap(a,10);

    system("PAUSE");

    return 0;

}

你可能感兴趣的:(数据结构)