堆排序

来源:互联网 发布:网络上有重名上不去网 编辑:程序博客网 时间:2024/05/16 17:13
/*堆排序*/#include<stdio.h>#define MAXSIZE 50typedef int KeyType;typedef struct      /*数据元素类型定义*/{    KeyType key;    /*关键字*/}DataType;typedef struct      /*顺序表类型定义*/{    DataType data[MAXSIZE];    int length;}SqList;void InitSeqList(SqList *L,DataType a[],int n)/*顺序表的初始化*/{    int i;    for(i=1;i<=n;i++)    {        L->data[i]=a[i-1];    }    L->length=n;}void DispList(SqList L,int n)/*输出表中的元素*/{    int i;    for(i=1;i<=n;i++)        printf("%4d",L.data[i].key);    printf("\n");}void CreateHeap(SqList *H,int n)        /*建立大顶堆*/{    int i;    for(i=n/2;i>=1;i--)                 /*从序号n/2开始建立大顶堆*/        AdjustHeap(H,i,n);}void AdjustHeap(SqList *H,int s,int m)  /*调整H.data[s...m]的关键字,使其成为一个大顶堆*/{    DataType t;    int j;    t=(*H).data[s];                     /*将根结点暂时保存在t中*/    for(j=2*s;j<=m;j*=2)    {        if(j<m&&(*H).data[j].key<(*H).data[j+1].key)            /*沿关键字较大的孩子结点向下筛选*/            j++;                        /*j为关键字较大的结点的下标*/        if(t.key>(*H).data[j].key)            /*如果孩子结点的值小于根结点的值,则不进行交换*/            break;        (*H).data[s]=(*H).data[j];      /*将根结点插入到正确位置*/        s=j;    }    (*H).data[s]=t;}void HeapSort(SqList *H)        /*对顺序表H进行堆排序*/{    DataType t;    int i;    CreateHeap(H,H->length);    /*创建堆*/    for(i=(*H).length;i>1;i--)  /*将堆顶元素与最后一个元素交换,重新调整堆*/    {        t=(*H).data[1];        (*H).data[1]=(*H).data[i];        (*H).data[i]=t;        AdjustHeap(H,1,i-1);    /*将(H).data[1...i-1]调整为大顶堆*/    }}main(){    DataType a[]={56,22,67,32,59,12,89,26,48,37};    int i,n=10;    SqList L;    InitSeqList(&L,a,n);    printf("排序前:");    DispList(L,n);    HeapSort(&L);    printf("堆排序结果:");    DispList(L,n);}

程序运行结果
这里写图片描述

原创粉丝点击