算法导论 堆排序
2015-04-01 16:17
148 查看
#include <stdio.h> #include <stdlib.h> //求左孩子下标 inline int Left(int i) { return i<<1; } //求右孩子下标 inline int Right(int i) { return (i<<1)+1; } //求父节点下标 inline int Parent(int i) { return i/2; } int count = 10; //调整某元素为根节点的堆为最大堆 void max_heap(int* a,int i) { int l = Left(i); int r = Right(i); int largest; if(l<count&&a[l]>a[i]) largest = l; else largest = i; if(r<count&&a[r]>a[largest]) largest = r; if(largest != i) { a[largest] = a[largest]^a[i]; a[i] = a[largest]^a[i]; a[largest] = a[largest]^a[i]; max_heap(a,largest); } } //建立最大堆 void bulid_max_heap(int* a) { int i=0; for(i=count/2;i>=1;i--) max_heap(a,i); } //堆排序 void heap_sort(int* a) { if(count <= 1) return; int i; for(i=count-1;i>=2;i--) { a[1] = a[1]^a[i]; a[count-1] = a[1]^a[i]; a[1] = a[1]^a[i]; count--; max_heap(a,1); } } int main() { int a[] ={0,2,3,4,1,10,8,6,9,7}; int i ; //for(i=1;i<10;i++) //scanf("%d",&a[i]); for(i=1;i<10;i++) printf("%d ",a[i]); printf("\n"); bulid_max_heap(a); heap_sort(a); for(i=1;i<10;i++) printf("%d " ,a[i]); system("pause"); return 0; }
相关文章推荐
- 算法导论:堆排序
- 算法导论读后感-之堆,堆排序,堆排序的应用
- 算法导论,堆排序,c实现。
- 算法导论 第六章:堆排序
- 算法导论学习笔记——堆排序
- 算法导论 第6章 堆排序
- 《算法导论》学习摘要chapter-6——堆排序
- 算法导论--堆排序
- 算法导论之插入排序,选择排序,归并排序,冒泡排序,希尔排序,堆排序,快速排序的c语言实现
- 《算法导论》第六章----堆排序
- 跟着《算法导论》学习——堆排序
- 算法导论堆排序的复习
- 算法导论:堆排序
- 算法导论-第六章-堆排序:基于最大堆的排序C++实现
- 《算法导论》读书笔记之第6章 堆排序
- 算法导论:堆排序递归实现 (c语言)
- 《算法导论》7、堆排序实现(C++)
- 《算法导论的Java实现》 7 堆排序
- 算法导论学习笔记(1)---堆排序
- 算法导论:堆排序