堆排序

来源:互联网 发布:看书哪个软件好 编辑:程序博客网 时间:2024/06/07 13:02

在一个一维数组中模拟二叉树,操作的堆排序。

#include <stdio.h>#include <stdlib.h>void Swap(int *num, int v, int u){    int temp = num[v];    num[v] = num[u];    num[u] = temp;}void PercolateDown(int num[],int index,int size){    int min;// 设置最小指向下标    while (index * 2 + 1<size) //判断是否有左节点    {        min = index * 2 + 1;        if (index * 2 + 2<size) //判断是否有右节点            min =num[min]<num[index * 2 + 2]?min:index * 2 + 2;//左右节点之间去更小        if (num[index]>num[min]) //最小节点与根节点比较        {            Swap(num, index, min);            index = min;        }        else        break;// 停止下滤操作    }}void PrintHeap(const char* strMsg,int num[],int nLength)//输出当前数列{    int i;    printf("%s",strMsg);    for(i=0; i<nLength; i++)    {        printf("%d ",num[i]);    }    printf("\n");}void BuildHeap(int num[] ,int size){    int i;    for (i = size / 2 - 1; i >= 0; i--)    {        PercolateDown(num, i,size);// 进行下滤操作        PrintHeap("Build heap:",num,size);    }}void SortHeap(int num[] ,int size){    int i;    int iLength=size;    PrintHeap("Befor Sort:",num,iLength);//原数列    BuildHeap(num,size);//建立小根堆    for(i = iLength - 1; i >0; i--)//从最后一个数开始替换队首    {        Swap(num, 0, i);// 交换        size--;// 每交换一次让规模减少一次        PercolateDown(num, 0,size);//将新的首元素下滤操作,因为建立了小根堆,所以操作到首位的一定是当前最小的数        PrintHeap("Sort Heap:",num,iLength);    }}int main(){    int a[100000];    int n,i;    printf("输入数组长度:");    scanf("%d",&n);    for(i=0;i<n;i++)    scanf("%d",&a[i]);    SortHeap(a,n);    system("PAUSE");    return 0;}


原创粉丝点击