经典排序——堆排序——C语言版
2017-05-10 15:52
330 查看
/*堆排序*/ /*利用数组实现完全二叉树,通过比较左孩子,右孩子和父亲结点的大小,将最小的与父亲节点交换,从而使得最小的一直向上移动。完成一次后将最末尾的节点值移动到最顶,重复前面操作,每次都使得最小的到顶端,并取出*/ #include<stdio.h> int heap_adjust(int s[],int i,int max) { int temp,lchild,rchild,k; temp=s[i]; lchild=2*i+1; rchild=lchild+1; while(lchild<=max) { if(rchild<=max && s[lchild]>s[rchild]) { k=rchild; } else { k=lchild; } if(s[k]<s[i]) { s[i]=s[k]; s[k]=temp; } i++; lchild=2*i+1; rchild=lchild+1; } return *s; } int heap_build(int s[],int max) { int i; for(i=(max-1)/2;i>=0;i--) { heap_adjust(s,i,max); } return *s; } int heap_sort(int s[],int max) { int i; int h[max]; heap_build(s, max); h[0]=s[0]; for(i=0;i<max;i++) { s[0]=s[max-i]; heap_adjust(s,0,max-i-1); h[i+1]=s[0]; } for(i=0;i<=max;i++) { s[i]=h[i]; } return *s; } int main() { int s[5]; int n,i; n=5; for(i=0;i<n;i+ 4000 +) { scanf("%d",&s[i]); } *s=heap_sort(s,n-1); for(i=0;i<n;i++) { printf("%d ",s[i]); } }
相关文章推荐
- 经典排序之 堆排序
- 【经典】【排序】快速排序算法、堆排序
- 经典内部排序: 堆排序,快排,归并排序
- 经典排序之 堆排序
- java进阶- 经典排序(插入排序、冒泡排序、快排(分划交换排序)、直接选择排序、堆排序、合并排序)
- 经典排序——快速排序——C语言版
- 经典排序之堆排序
- 经典排序——桶排序——C语言版
- 经典排序之堆排序
- 经典排序之堆排序
- 经典排序算法 -----冒泡排序,插入排序,快速排序,归并排序,堆排序
- 经典排序——插入排序——C语言版
- 数据结构经典排序---堆排序
- 经典排序之堆排序
- 第十五周——项目一—验证算法(6)选择排序之堆排序
- 选择排序之堆排序(大顶堆)
- 经典排序之冒泡排序
- 白话经典算法系列之六 高速排序 高速搞定
- C语言程序----排序(直接插入排序,SHELL排序,冒泡排序,快速排序,简单选择排序,堆排序)
- 白话经典算法系列之七 堆与堆排序