排序算法——堆排序
2009-08-08 14:20
176 查看
主要设计操作:
(1)max_heap():调整堆使其保持堆性质
(2)build_heap():堆的建立
(3)sort_heap():堆排序
(1)max_heap():调整堆使其保持堆性质
(2)build_heap():堆的建立
(3)sort_heap():堆排序
1 #include <iostream> 2 using namespace std; 3 #define N 10 4 //大顶堆的保持: 5 //a:数组 6 //i:节点i出可能不满足大顶堆的性质,需要调整 7 //n:此时堆中元素的个数,n<=N 8 void max_heap(int *a,int i,int n) 9 { 10 int l = 2*i+1; 11 int r = 2*i+2; 12 int large = 0; 13 14 while(l<n || r < n)//循环终止条件 15 { 16 large = i; 17 if(l<n && a[large] < a[l]) 18 large = l; 19 if(r<n && a[large]<a[r]) 20 large = r; 21 if(large == i)//当节点i本来就满足大顶堆性质时,不需要调整 22 break; 23 int tmp = a[large]; 24 a[large] = a[i]; 25 a[i] = tmp; 26 i = large; 27 l = 2*i+1; 28 r = 2*i+2; 29 } 30 } 31 void build_heap(int *a) 32 { 33 int i = 0; 34 for(i=N/2-1;i>=0;i--)//从第一个非叶子节(N/2-1)点开始,通过自下向上调整每一个非叶子节点 35 { 36 max_heap(a,i,N); 37 } 38 } 39 void sort_heap(int *a) 40 { 41 build_heap(a);//首先建立一个大顶堆 42 int i = 0; 43 i=N-1; 44 while(i>0)//将大顶堆的根节点和最后一个叶子节点交换,然后重新调整堆,使满足大顶堆性质 45 { 46 int tmp = a[i]; 47 a[i] = a[0]; 48 a[0] = tmp; 49 max_heap(a,0,i); 50 i--; 51 } 52 } 53 int main() 54 { 55 int a[10]={3,5,0,0,0,9,12,1,2,7}; 56 int i =0; 57 sort_heap(a); 58 for(i = 0;i<N;i++) 59 cout << a[i] << " " ; 60 cout <<endl; 61 }
相关文章推荐
- 排序算法----堆排序
- 排序算法(七) 堆排序
- 排序算法---堆排序
- 常用的排序算法(快速排序、插入排序、希尔排序、堆排序、冒泡排序、选择排序、归并排序)
- 排序算法的数组实现 -- 堆排序(二)
- Java-时间复杂度为O(nlogn)的排序算法(快速排序, 归并排序, 堆排序, 希尔排序)
- 【排序算法】-堆排序
- 排序算法(1):插入排序,选择排序,希尔排序,堆排序
- 排序算法-堆排序
- 写个堆排序,快速排序等一些排序算法
- 排序算法之四--堆排序
- 排序算法总结4-堆排序
- 排序算法之堆排序(Java)
- 排序算法——堆排序
- [排序算法]堆排序
- 排序算法思想——归并排序、堆排序、shell排序
- 【排序算法】堆排序的分析
- 排序算法之 堆排序
- 排序算法(五) —— 堆排序
- 常见排序算法总结与实现(冒泡、插入、选择、希尔、堆排序、归并、快排)