堆排序算法
2015-08-07 15:55
281 查看
小根堆:所有子节点都大于其父节点。
大根堆:所有子节点都小于其父节点。
大根堆:所有子节点都小于其父节点。
int heapSize = 0; //返回左子节点索引 int Left(int index){return ((index << 1) + 1);} //返回右子节点索引 int Right(int index){return ((index << 1)+ 2;)} //交换a,b的值 void swap(int *a, int *b){int temp = *a; *a = *b; *b = temp;} //array[index]与其左、右子树进行递归对比 //用最大值替换array[index],index表示堆顶索引 void maxHeapify(int array[], int index) { int largest = 0; int left = Left(index); //左子节点索引 int right = Right(index); //右子节点索引 //把largest赋为堆顶与其左子节点的较大值 if((left <= heapSize) && (array[left] > array[index])) largest = left; else largest = index; //把largest与堆顶的右子节点比较,取较大值 if((right <= heapSize) && (array[right] > array[largest])) largest = right; //此时largest为堆顶、左子节点、右子节点中的最大值 if(largest != index) { //如果堆顶不是最大值,则交换,并递归调整堆 swap(&array[index],&array[largest]); maxHeapify(array, largest); } } //初始化堆,将数组中的每一个元素置放到适当的位置 //完成之后,堆顶的元素为数组的最大值 void buildMaxHeap(int array[], int length) { int i; heapSize =length; //堆大小赋为数组长度 for( i = (length >> 1); i >=0; i--) { maxHeapify(array, i); } } void heap_sort(int array[], int length) { int i; //初始化堆 buildMaxHeap(array, (length - 1)); for(i = (length - 1); i >= 1; i--) { //堆顶元素array[0](数组的最大值)被置换到数组的尾部array[i] swap(&array[0],&array[i]); heapSize--; //从堆中移除该元素 maxHeapify(array, 0); //重建堆 } }
相关文章推荐
- 需要这样一个记事本-15 ReportViewer打印默认页边距、页面方向问题
- 浅析JVM
- POJ1149 PIGS (最大流)
- 大数据专家Bernard Marr:大数据是如何对抗癌症的?
- Devexpress Report Service 使用方法
- (四) Basic Build Customization(基本的构建定制 :签名,构建,混淆)
- A1062 Talent and Virtue (25)
- 数据结构基础(23) --红黑树的设计与实现(中)
- requireJS使用
- (绝对有用)iOS获取UUID,并使用keychain存储
- CentOS安装Redis
- 设置HttpSendRequest阻塞时间
- codeforces 567C Geometric Progression
- 工作周记
- 【翻译】在Ext JS 6通用应用程序中使用既共享又特定于视图的代码
- 需要这样一个记事本-14 ReportViewer在多页报表情况下,每页都显示表格列表头
- 理解 Statement 和 PreparedStatement区别
- JNI调用遇到的问题
- ehcache memcache redis 三大缓存男高音
- 默认选中ext:GridPanel第一行数据