堆排序
2018-01-22 10:23
162 查看
堆排序是一种特殊的树形数据结构,其每个节点都有一个值,通常提到的堆都是指一棵完全二叉树,根节点的值小于(或大于)两个子节点的值,同时根节点的两个子树也分别是一个堆。堆排序主要包括两个过程:一是构建堆,二是交换堆顶元素与最后一个元素的位置。
#include <stdio.h> void DisArray(int a[],int n); void AdjustHeap(int a[],int s,int m); void CreateHeap(int a[],int n); void HeapSort(int a[],int n); int main() { int a[]={67,48,23,81,38,19,52,40}; int n=sizeof(a)/sizeof(a[0]); printf("排序前:"); DisArray(a,n); HeapSort(a,n); printf("排序后:"); DisArray(a,n); return 0; } void DisArray(int a[],int n)//打印 { int i; for(i=0;i<n;i++) { printf("%4d",a[i]); } printf("\n"); } void CreateHeap(int a[],int n)//创建堆 { int i; for(i=n/2-1;i>=0;i--) { AdjustHeap(a,i,n-1); } } void AdjustHeap(int a[],int s,int m)//调整堆 { int t,j; t=a[s]; for(j=2*s+1;j<=m;j*=2+1) { if(j<m&&a[j]<a[j+1]) { j++; } if(t>a[j]) { break; } else { a[s]=a[j]; s=j; } } a[s]=t; } void HeapSort(int a[],int n) { int t,i; CreateHeap(a,n); for(i=n-1;i>0;i--) { t=a[0]; a[0]=a[i]; a[i]=t; printf("第%d趟排序结果:",n-1); DisArray(a,n); AdjustHeap(a,0,i-1); } }
相关文章推荐
- 算法--堆排序
- Python 面试题 - 堆排序 & 演算过程
- 排序算法-堆排序
- 为什么从5000个数中找出10个最大的堆排序最快?
- 算法设计与分析基础-6.4、堆和堆排序
- 哈夫曼树结合堆排序 POJ(3253)
- 算法学习笔记----第二部分:排序和顺序统计量----第6章、堆排序
- 算法导论之插入排序,选择排序,归并排序,冒泡排序,希尔排序,堆排序,快速排序的c语言实现
- 堆排序 一个综合了插入排序和二路归并特点的排序算法(未测试)
- Heap-堆排序
- [字符串hash][堆排序][AC自动机][usaco3.1.5]Contact
- 堆排序
- 算法导论堆排序Java实现
- C++数据结构--堆排序
- C/C++排序之五(堆排序)
- 堆排序
- 图灵标准版堆排序
- 堆排序详解以及java实现
- 堆排序
- 堆排序