【算法】C语言实现堆排序
2014-12-27 23:24
411 查看
直接上代码。
#include<stdio.h> #include<stdlib.h> typedef struct heap_t{ int *arr; //point for an array to store heap value. int heapMaxIndex; //heap element max index number int arrLength; //array length of arr }Heap; void maxHeapify(Heap *hp, unsigned int nodei) { unsigned int l = (nodei+1) << 1 - 1; //left child = 2i-1, -1 ?:arr[0..n-1] unsigned int r = (nodei+1) << 1 ; // right child = 2i unsigned int largest = 0; int heapMaxI = hp->heapMaxIndex; if(l <= heapMaxI && hp->arr[l] > hp->arr[nodei]) largest = l ; else largest = nodei ; if(r <= heapMaxI && hp->arr[r] > hp->arr[largest]) largest = r ; if(largest!=nodei) { //exchange int tmp ; tmp = hp->arr[largest]; hp->arr[largest] = hp->arr[nodei]; hp->arr[nodei] = tmp; maxHeapify(hp,largest); }else{ return ; } } Heap *createHeap(int *arrp, int arrLength,Heap *heap) { int i; heap->arr = arrp; heap->heapMaxIndex = arrLength-1; heap->arrLength = arrLength; //for an heap a[0..n-1]; a[(n/2)..n-1] all are leaves for(i = arrLength>>1-1; i >=0; i--) maxHeapify(heap,i); return heap; } void heapSort(Heap *hp) { int tmp; int last; while(hp->heapMaxIndex>0) { last = hp->heapMaxIndex ; //exchange tmp = hp->arr[last]; hp->arr[last] = hp->arr[0]; hp->arr[0] = tmp; hp->heapMaxIndex -= 1; maxHeapify(hp,0); //make heap from root node 0 to heapMaxIndex } } void printArr(int *p, int size) { int i; for(i=0; i<size;i++) { printf("%d ",p[i]); } } int main() { int a[]={15,25,32,23,1,-4,35,2,-85,42,0,12,26,56,45,12,145,17,25,21}; printArr(a,20); printf("\n"); Heap hpa,*phpa; phpa = createHeap(a,20,&hpa); heapSort(phpa); printArr(a,20); putchar('\n'); return 0; }
相关文章推荐
- 算法导论 堆排序 C语言实现
- [算法练习]堆排序的C语言实现
- 算法导论之插入排序,选择排序,归并排序,冒泡排序,希尔排序,堆排序,快速排序的c语言实现
- C语言对堆排序一个算法思路和实现代码
- 数值计算方法与算法:C语言实现利用Gauss消元法解方程组
- 10个重要的算法C语言实现源代码:拉格朗日,牛顿插值,高斯,龙贝格,牛顿迭代,牛顿-科特斯,雅克比,秦九昭,幂法,高斯塞德尔
- C语言中实现 点在多边形内 算法
- 插入排序,合并排序,堆排序,快速排序,计数排序的实现(算法导论)
- 一个UUID生成算法的C语言实现 --- WIN32版本
- 10个重要的算法C语言实现源代码:拉格朗日,牛顿插值,高斯,龙贝格,牛顿迭代,牛顿-科特斯,雅克比,秦九昭,幂法,高斯塞德尔
- 10个重要的算法C语言实现源代码
- C# 实现常用的算法-- 堆排序(转)
- 10个重要的算法C语言实现源代码:拉格朗日,牛顿插值,高斯,龙贝格,牛顿迭代,牛顿-科特斯,雅克比,秦九昭,幂法,高斯塞德尔
- 10个重要的算法C语言实现源代码(其6和7--牛顿-科特斯和雅克比)
- 10个重要的算法C语言实现源代码(8-9-10-----秦九昭和幂法和高斯塞德尔)
- 10个重要的算法C语言实现源代码(其1-拉格朗日)
- md5 算法的c语言实现及应用
- 有关统计单词频率的算法c语言实现
- 防脉冲干扰移动平均值法数字滤波器的C语言算法及其实现
- 10个重要的算法C语言实现源代码(其3--高斯列主元消去法)