算法导论之堆排序
2012-04-15 20:41
148 查看
/* *Author:justinzhang *Email:uestczhangchao@gmail.com *Discription:实现算法导论第六章的堆排序算法 *Time:2011年5月11日15:39:30 */ #include <stdio.h> void swap(int *x,int *y) { int tmp = *x; *x = *y; *y = tmp; } //建立以i为根节点的大顶堆 void Max_Heapify(int A[], int i,int heapsize) { int l=2*i;//取i的左孩子 int r=2*i+1;//取i的右孩子 int largest;//记录根节点、左孩子、有孩子中最大一个的索引 if(l<=heapsize && A[l]>A[i]) largest = l; else largest = i; if(r<=heapsize && A[r]>A[largest]) largest = r; if(largest!= i) { swap(&A[i],&A[largest]);//将最大元素放到根节点上 Max_Heapify(A,largest,heapsize);//处于根为largest的堆有可能被破坏,递归进行调整 } } //建立初始堆 void Build_Max_Heap(int A[],int heapsize) { int i; //最大的内部节点(有叶子节点的节点)为n/2 //从最大的内部节点到整棵数的根节点建立大顶堆 for(i=heapsize/2;i>=1;i--) { Max_Heapify(A,i,heapsize); } } //堆排序算法 void HeapSort(int A[],int len) { int i; Build_Max_Heap(A,len); //不断的将堆顶元素与数组中索引为len的元素交换 for(i=len;i>=2;i--) { swap(&A[1],&A[len]); len--; Max_Heapify(A,1,len); } } int main() { //这里数组下标从1开始,数组第一个元素没有使用 int A[] = {0,-12,5,55,5,4,3,2,1}; int i; HeapSort(A,5); for(i=1;i<=5;i++) printf("%d\n",A[i]); system("pause"); return 0; }
.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
相关文章推荐
- 算法导论堆排序实现
- 算法导论第6章实现堆排序的完整程序
- 算法导论-----------堆排序研究 (堆排序原理及算法实现(最大堆))
- 算法导论详解(5) 第六章 堆排序
- 算法导论--堆排序
- 算法导论之堆排序(堆排序、n*lgk 归并、杨氏矩阵)
- 《算法导论》学习总结 --- 4.第六章(1) 堆排序
- 算法导论——第二章——堆排序
- 《算法导论》第6章 堆排序 (2)优先级队列
- 《算法导论》学习笔记(1)——堆与堆排序
- 算法导论笔记-第六章-堆排序
- 《算法导论》(二)--堆排序
- 算法导论笔记之堆排序
- 《算法导论》第6章 堆排序 (2)优先级队列
- 算法导论笔记——堆排序
- 算法导论——lec 06 堆排序
- 《算法导论》(二)--堆排序
- 学习《算法导论》第六章 堆排序 总结
- 《算法导论》第6章 堆排序 (1)最大堆与堆排序
- 《算法导论》第6章 堆排序 (2)优先级队列