您的位置:首页 > 理论基础 > 数据结构算法

堆排序---最大堆的创建和最大推的排序

2016-08-16 22:19 211 查看
typedef struct{
int data[100+1];
int length;
}Slist;
void swap(Slist *L,int i,int j){
int tmp=L->data[i];
L->data[i]=L->data[j];
L->data[j]=tmp;
}

void HeapAdjust(Slist *L,int s,int m){
//理解该代码要完全二叉树联系起来,不清楚画图分析
//并理解堆排序的定义-----最大堆:每个节点值都大于或等于左右孩子节点值。
int temp=L->data[s];
for(int j=2*s;j<=m;j*=2){

if(j<m && L->data[j]<L->data[j+1])//找出左右子树中值大的。并记住下标
j++;
if(temp>L->data[j]) //对当前要调整节点值和左右子树中较大的值比较。若比左右子树值都大则不交换数据。
break;
L->data[s]=L->data[j];
s=j;
}
L->data[s]=temp;
}
//创建最大堆--创建顺序:从下往上,从右往左。
void craateHeap(Slist *L){
for(int i=L->length/2;i>0;i--)//完全二叉树非叶子节点个数=叶子节点个数或者叶子节点个数-1;
HeapAdjust(L,i,L->length);
}
//已知最大堆,进行排序
void Maxheapsort(Slist *L){
for(int i=L->length;i>1;i--){// n-1次循环
swap(L,1,i);
HeapAdjust(L,1,i-1);
}
}
void main(){
int a[]={0,110,10,35,30,71,42,80,23,43,54,67};

int len=sizeof(a)/sizeof(int)-1;
//1、初始化未排序的线性表

Slist SS,*L;
L=&SS;
L->length=len;
int i=len;
while (i)
{
L->data[i]=a[i];
i--;
}
printf("数据未排序前:\n ");
for(int k=1;k<=L->length;k++)
printf("%d  ",L->data[k]);
//2、对已知未排序的线性表进行最大堆的创建
craateHeap(L);
//3、对最大堆进行排序(完全二叉树层次排序)
Maxheapsort(L);
//4、打印查看
printf("\n  数据排序后:\n ");
for(int k=1;k<=L->length;k++)
printf("%d  ",L->data[k]);
while (true)
{

}

}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息