堆排序---最大堆的创建和最大推的排序
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) { } }
相关文章推荐
- 堆排序 维护最大堆 创建最大堆 排序最大堆
- 创建可分页、可排序的 DataGrid
- 使用XML、XSLT和XPath创建可排序、分页、重用的数据显示页面
- XML创建可排序、分页的数据显示页面
- C#.net获取指定文件夹下的所有jpg文件,并按文件创建时间排序
- 求最大值、索引、排序总结
- C/C++数组排序、计算平均值、最大、小值
- 最大堆排序Max_Heapify
- 免费使用Anole示例——动态创建带有排序功能和下拉列表风格的组合框
- 动态创建DataGrid 列排序功能的实现
- SQL取得最大排序数字并累加1的自定义函数
- 在DataGrid中创建排序列
- 创建可分页、可排序的 DataGrid
- Scott Mitchell 的ASP.NET 2.0数据操作教程之二十七:创建自定义排序用户界面
- 对1000000个数进行排序找出10个最大的数
- XML创建可排序、分页的数据显示页面
- XML创建可排序、分页的数据显示页面
- 创建可分页、可排序的 DataGrid
- C#中使用快速排序按文件创建时间将文件排序的源码
- ASP.NET 2.0中的数据操作二十七:创建自定义排序用户界面