排序算法系列----堆排序(C++)

来源:互联网 发布:网络利大于弊的辩论词 编辑:程序博客网 时间:2024/06/06 02:39

个人总结理解堆排序的关键点:
1.堆:首先,堆是一种完全二叉树,并且,每个节点的值都大于或等于其左右孩子节点的值,称为大顶堆;或者每个孩子节点的值都小于或等于其左右孩子节点的值,称为小顶堆;
2.基本思想:将待排序的序列先构造成大顶堆。利用大顶堆的特点(最大值在根节点),根节点的值与堆数组的末尾元素进行交换,此时末尾元素就是最大值,然后将剩余的元素重新调整成一个大顶堆,此时根节点上是当前序列的最大值(整个序列的次大值),然后将根节点元素与末尾元素进行交换,如此循环进行,即可完成排序。
3.如何由一个无序序列构造成一个大(小)顶堆。
4.输出堆顶元素后,剩余元素调整成一个新的大(小)顶堆。
C++实现代码:

# include <iostream># define SIZE 10using namespace std;void HeapAdjust(int a[],int s,int m){    int j,temp;    temp = a[s];    for (j=2*s;j<=m;j*=2)    {        if (j<m&&a[j]<a[j+1])        {            ++j;        }        if (temp>a[j])            break;        a[s] = a[j];        s = j;     }    a[s] = temp;}void swap(int sort[],int p,int q){    int temp;    temp = sort[p];    sort[p] = sort[q];    sort[q] = temp;}void HeapSort(int a[],int length){    int i;    for (i=length/2;i>0;i--)    {        HeapAdjust(a,i,length);    }    for (i=length;i>1;i--)    {        swap(a,1,i);        HeapAdjust(a,1,i-1);    }}void main(){    int num;    int sort[SIZE] = {0,50,10,90,30,70,40,80,60,20};    HeapSort(sort,SIZE-1);    for (num=1;num<SIZE;num++)    {        cout<<sort[num]<<" ";    }}

理解的方法同样,自己构造序列,然后模拟计算机运行,理解这个算法。

0 0
原创粉丝点击