堆排序
2012-10-31 22:27
141 查看
最大堆排序算法:
View Code
View Code
#include<stdio.h> #include<stdlib.h> #define LEFT(i) i*2+1 #define RIGHT(i) i*2+2 #define PARENT(i) floor((i-1)/2) typedef int DataType; /* 局部特性:对节点i,考察它的子树,将其子树下面的最大值换到该节点上来。 */ void max_heapify(DataType A[],int i,int length) { int l,r; int large; l = LEFT(i); r = RIGHT(i); if( (l < length) && (A[l] > A[i])){ large = l; }else{ large = i; } if( (r < length) && (A[r] > A[large])){ large = r; } if(large != i){ DataType tmp; tmp = A[i]; A[i] = A[large]; A[large] = tmp; max_heapify(A,large,length); } } /* 构建大堆结构,对于叶子节点,无需进行调整,所以只需调整中间节点。而中间节点的范围是再0-PATENT(length)直接。 */ void build_max_heap(DataType A[],int length) { int i; for(i=PARENT(length);i>=0;i--){ max_heapify(A,i,length); } } /* 堆排序,由于0元素再建堆之后,肯定是最大的。所以将其摘到数组最后,将叶子调到堆中。然后对0元素做堆出来,找到最大的那个,再摘到数组中 这样循环,直到堆中的最后一个元素。这里可以看出来,其实这样做的冗余度挺大的。因为如果堆高度很高,而每一次摘除之后,找到最大的那个元素 需要做很多递归调用。因为需要改进尽快找到那个最大的元素。 */ void heapsnort(DataType A[],int length) { int i; build_max_heap(A,length); for(i=length-1;i>0;i--){ DataType tmp; tmp = A[0]; A[0] = A[i]; A[i] = tmp; max_heapify(A,0,i); } } int main() { int i; int length; DataType A[10]={4,1,3,2,16,9,10,14,8,7}; printf("sizeof = %d\n",sizeof(A)/sizeof(DataType)); length = sizeof(A)/sizeof(DataType); //max_heapify(A,1,length); //build_max_heap(A,length); heapsnort(A,length); for(i=0;i<10;i++){ printf("%d ",A[i]); } printf("\n"); return 0; }
相关文章推荐
- 第十八篇:内部排序之三:堆排序(含完整源码)
- 选择排序之简单选择排序和堆排序
- 堆排序
- 排序算法之---堆排序
- 【初探】 堆排序
- 4-1 堆排序简介,为什么要使用堆
- 牛客网Java刷题知识点之插入排序(直接插入排序和希尔排序)、选择排序(直接选择排序和堆排序)、冒泡排序、快速排序、归并排序和基数排序(博主推荐)
- 堆排序
- 堆排序(大根堆)算法
- 一个简单的堆排序(heapsort)
- 最小堆与堆排序
- 调整堆以及堆排序
- 堆排序(1)
- 堆排序
- C语言程序----排序(直接插入排序,SHELL排序,冒泡排序,快速排序,简单选择排序,堆排序)
- 算法储备之堆排序
- 堆排序 heapsort
- 算法储备之Dijkstra算法的各种优化(堆排序、priority_queue、set 优化)
- [BCZ-HEAP]堆排序的实现,包括建堆,siftup(主要用于建堆)和siftdown(主要用于调整)函数的实现
- 数据结构与算法-堆与堆排序