堆栈排序算法

来源:互联网 发布:pooled ols对截面数据 编辑:程序博客网 时间:2024/06/02 06:31
#include <stdio.h>
typedef struct stu{
int length;   // 结构体中str数组的大小 
int str[11]; 
}list;
void swap(list *p,int s,int m)    // 交换数组的第一个和最后一个元素 
{
int t;
t=p->str[s];
p->str[s]=p->str[m];
p->str[m]=t;
}
void fun(list *p,int s,int m)  // 构建一个最大数在最顶端的二叉树(用数组str表示) 
{
int j,temp;
temp=p->str[s];
//这里自己画图自己分析一下,看图很容易理解     
for(j=2*s;j<=m;j*=2)
{
if(j<m&&p->str[j]<p->str[j+1])  // 找到左右两个孩子中最大的数的下标 
j++;
if(temp>=p->str[j])  // 如果父结点比左右两个孩子中最大的还大,结束循环 
break;
p->str[s]=p->str[j];  // 把左右孩子中大的一个赋值给父结点 
s=j;   // 为下一次循环赋值做准备 
}
p->str[s]=temp;  // 这里完成交换赋值 

}
void sore(list *p)  
{
int i,j;
for(i=p->length/2;i>0;i--)  // 左孩子的结点下标是父结点的2x,右孩子为2x+1; 
fun(p,i,p->length);
for(i=p->length;i>1;i--)
{
swap(p,1,i);
fun(p,1,i-1);
}
}
void print(list *p)
{
int i;
for(i=1;i<10;i++)
printf("%d ",p->str[i]);
}
int main()
{
int i;
list p;
for(i=1;i<10;i++)
scanf("%d",&p.str[i]);
p.length=9;
sore(&p);
print(&p);


0 0
原创粉丝点击