堆排序源码(heap sort)

来源:互联网 发布:办公软件培训心得体会 编辑:程序博客网 时间:2024/05/16 11:28

#include <iostream>

#include <ctime>

using namespace std;

 

// 注意父子的计算方式。节点编号从0开始。

inline int parent(const int x) { return ((x-1)/2); }

inline int left(const int x) { return (2*x+1); }

inline int right(const int x) { return (2*x+2); }

 

int cmp = 0;    // 总共执行比较操作的次数

int swp = 0;    // 总共执行交换操作的次数

 

// 调整以i为根的子树,使之成为最大堆,size为堆的大小

void maxHeapify(int a[], int size, int i)

{

    cmp +=2;

    swp++;

 

    int l = left(i);

    int r = right(i);

    int largest = i;    // 最大堆的根

   

    if( (l < size) && (a[l] > a[i]) )        largest = l;

    if( (r < size) && (a[r] > a[largest]) )  largest = r;

    if( largest != i )

    {

        swap(a[i], a[largest]);         // 三个节点中较大者成为根

        maxHeapify(a, size, largest);   // 可能破坏了堆性质,重新调整

    }

}

 

void buildMaxHeap(int a[], int size)    // 建堆

{

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

    {

        maxHeapify(a, size, i);

    }

}

 

void heapSort(int a[], int size)        // 堆排序,(n-1)*O(lgn) = O(nlgn)

{

    swp++;

 

    buildMaxHeap(a, size);

    for(int i=size-1; i>0; i--)         // 重复n-1

    {

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

        size--;

        maxHeapify(a, size, 0);         // 每次调整,花费为O(lgn)

    }

}

 

int main()

{

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

 

    heapSort(a, sizeof(a)/sizeof(a[0]));

 

    cout << "总共进行比较 " << cmp << " 次,总共进行交换 " << swp << " " << endl;

 

    for(int i=0; i<sizeof(a)/sizeof(a[0]); i++)

    {

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

    }

    cout << endl;

 

    return 0;

}

原创粉丝点击