/**
* 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");
}
堆排序算法(c语言)
原文作者:排序算法
原文地址: https://blog.csdn.net/gubojun123/article/details/8393853
本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
原文地址: https://blog.csdn.net/gubojun123/article/details/8393853
本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。