Fork me on GitHub

数据结构练习——堆排序

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

#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;
}
posted @ 2012-09-17 14:51  _Lei  阅读(620)  评论(0编辑  收藏  举报