堆排序算法(c语言)

来源:互联网 发布:.top域名注册 4元 编辑:程序博客网 时间:2024/06/10 09:17
/** * author:gubojun * time:2012-12-23 * name:堆排序 */ /*  解析:本程序对数列  312,126,272,226,28,165,123,8,12  进行排序  首先进入heapsort函数对所有元素建堆  初始状态------------------------------------------------------------------------        0        1       2       3       4       5       6       7       8       9     NULL      312     126     272     226      28     165     123       8      12  4)------------------------------------------------------------------------------        0        1       2       3       4       5       6       7       8       9      226      312     126     272       8      28     165     123     226      12  3)------------------------------------------------------------------------------        0        1       2       3       4       5       6       7       8       9      272      312     126     123       8      28     165     272     226      12  2)------------------------------------------------------------------------------        0        1       2       3       4       5       6       7       8       9      126      312       8     123     126      28     165     272     226      12   4    0        1       2       3       4       5       6       7       8       9      126      312       8     123      12      28     165     272     226     126  1)------------------------------------------------------------------------------        0        1       2       3       4       5       6       7       8       9      312        8     312     123      12      28     165     272     226     126   2    0        1       2       3       4       5       6       7       8       9      312        8      12     123     312      28     165     272     226     126   4    0        1       2       3       4       5       6       7       8       9      312        8      12     123     126      28     165     272     226     312--------------------------------完成  */#include<stdio.h>typedef struct{    int r[101];    int length;}table;/************************************************** *  函数功能:筛选算法 *  函数参数:结构类型table的指针变量tab *            整型变量k为调整位置 *            整型变量m为堆的大小 *  函数返回值:空 *  文件名:sift.c 函数名:sift() **************************************************/void sift(table *tab,int k,int m){    int i,j,finished;    i=k;j=2*i;    tab->r[0]=tab->r[k];    finished=0;    while((j<=m)&&!finished){        if(j<m && tab->r[j+1] < tab->r[j]) j++;//如果看成二叉树,右子树的元素值小于左子树的元素值        if(tab->r[0] <= tab->r[j]) finished=1;//如果r[0]是最小的就完成        else{            tab->r[i]=tab->r[j];            i=j;            j=j*2;        }    }    tab->r[i]=tab->r[0];}/************************************************** *  函数功能:堆排序算法 *  函数参数:结构类型table的指针变量tab *  函数返回值:空 *  文件名:heapsort.c,函数名:heapsort() **************************************************/void heapsort(table *tab){    int i;    for(i=tab->length/2;i>=1;i--)        sift(tab,i,tab->length);/*对所有元素建堆,最小的数字在tab.r[1]中*/    for(i=tab->length;i>=2;i--){/* i表示当前堆的大小,即等待排序的元素的个数*/        tab->r[0]=tab->r[i];        tab->r[i]=tab->r[1];        tab->r[1]=tab->r[0];/*上述3条语句为将堆中最小元素和最后一个元素交换*/        sift(tab,1,i-1);/*对剩下的元素建堆,最小的数字在tab.r[1]中*/    }}int main(){    table tab;    int num[10]={272,126,312,226,28,165,123,8,12};    int i;    //初始化    for(i=1;i<=9;i++){        tab.r[i]=num[i-1];    }    tab.length=9;    //打印初始表    for(i=1;i<=9;i++){        printf("%d  ",tab.r[i]);    }    printf("\n");    //进行堆排序    heapsort(&tab);    //打印排序后的表    for(i=1;i<=9;i++){        printf("%d  ",tab.r[i]);    }    printf("\n");}

原创粉丝点击