堆排序算法(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");}