堆排序

来源:互联网 发布:截动态图软件 编辑:程序博客网 时间:2024/05/29 09:39

堆排序是一种特殊的树形数据结构,其每个节点都有一个值,通常提到的堆都是指一棵完全二叉树,根节点的值小于(或大于)两个子节点的值,同时根节点的两个子树也分别是一个堆。堆排序主要包括两个过程:一是构建堆,二是交换堆顶元素与最后一个元素的位置。

#include <stdio.h>void DisArray(int a[],int n);void AdjustHeap(int a[],int s,int m);void CreateHeap(int a[],int n);void HeapSort(int a[],int n);int main(){int a[]={67,48,23,81,38,19,52,40};int n=sizeof(a)/sizeof(a[0]);printf("排序前:");DisArray(a,n);HeapSort(a,n);printf("排序后:");DisArray(a,n);return 0;}void DisArray(int a[],int n)//打印 {int i;for(i=0;i<n;i++){printf("%4d",a[i]);}printf("\n");}void CreateHeap(int a[],int n)//创建堆 {int i;for(i=n/2-1;i>=0;i--){AdjustHeap(a,i,n-1);}}void AdjustHeap(int a[],int s,int m)//调整堆 {int t,j;t=a[s];for(j=2*s+1;j<=m;j*=2+1){if(j<m&&a[j]<a[j+1]){j++;}if(t>a[j]){break;}else{a[s]=a[j];s=j;}}a[s]=t;}void HeapSort(int a[],int n){int t,i;CreateHeap(a,n);for(i=n-1;i>0;i--){t=a[0];a[0]=a[i];a[i]=t;printf("第%d趟排序结果:",n-1);DisArray(a,n);AdjustHeap(a,0,i-1);}}




原创粉丝点击