算法入门--堆排序2(建立最小堆,从大到小)
2011-11-24 17:18
295 查看
#include <stdio.h> #include <stdlib.h> int left(int i)//返回左孩子位置 { return 2*i; } int right(int i)//返回右孩子位置 { return 2*i+1; } void min_heapify(int *a,int heap_size,int i)//保持堆性质,使以i为根的子树成为最小堆 ,heap_size当前堆中元素数量 { int l,r,least; int temp; l=left(i); r=right(i); if(l<=heap_size&&a[l]<a[i]) least=l; else least=i; if(r<=heap_size&&a[r]<a[least]) least=r; if(least!=i) { temp=a[i]; a[i]=a[least]; a[least]=temp; min_heapify(a,heap_size,least); } } void build_min_heap(int *a,int length)//建立最小堆 { int i,heap_size; for(i=length/2;i>=1;i--) min_heapify(a,length,i); } void heap_sort2(int *a,int length)//堆排序,从大到小 ,length为堆中元素数量 { int heap_size=length; int i,temp; build_min_heap(a,length);//建立最小堆 for(i=length;i>=2;i--) { temp=a[i]; a[i]=a[1]; a[1]=temp; heap_size--; min_heapify(a,heap_size,1);//重新调整为最小堆 } } int main(int argc, char *argv[]) { // int a[11]={0,4,1,3,2,16,9,10,14,8,7};//测试数据 //int length=10; int length;//数组中的堆的数据的长度 int a[100]; a[0]=0; int i; printf("请输入元素的数量:"); scanf("%d",&length); printf("\n请依次输入%d个元素,空格结束:\n",length); for(i=1;i<=length;i++) scanf("%d",&a[i]); printf("\n"); for(i=1;i<=length;i++) printf("%d ",a[i]); printf("\n------------------------\n"); printf("建立最小堆以后\n"); build_min_heap(a,length); for(i=1;i<=length;i++) printf("%d ",a[i]); printf("\n"); printf("使用堆排序后:\n"); heap_sort2(a,length); for(i=1;i<=length;i++) printf("%d ",a[i]); system("PAUSE"); return 0; }
相关文章推荐
- 算法入门--堆排序(最大堆,从小到大排序)
- [算法入门]排序算法之堆排序
- 数据结构与算法之最小堆的建立
- 2013-5-13算法入门--堆排序
- 经典算法: 堆排序的原理和实现, 建立堆,调整堆
- 建立最小堆的下滑算法
- Floodlight 入门 之 起步篇 - 建立一个Floodlight模块
- 算法入门学习----2.2快速排序
- 【广告算法工程师入门 39】模型特征-算法基础之线性模型
- 算法竞赛入门经典 2.1 for 循环
- SSE图像算法优化系列八:自然饱和度(Vibrance)算法的模拟实现及其SSE优化(附源码,可作为SSE图像入门,Vibrance算法也可用于简单的肤色调整)。
- 算法竞赛入门经典-第五章周期串
- 算法竞赛入门经典-第五章6174问题
- 算法入门——递归
- 算法基础:数据结构与算法入门概览
- 【算法竞赛入门经典】DAG上的动态规划 例题9-2 UVa437
- 【算法竞赛入门经典】DAG上的动态规划 例题9-3 UVa1347
- 数字三角形问题 算法入门经典
- 第八周【项目2 - 建立链串的算法库】
- 蓝桥杯算法 入门 圆的面积