算法(2)堆排序
来源:互联网 发布:软件方案文档 编辑:程序博客网 时间:2024/05/01 22:59
堆排序的操作时这样的:
//Heapfy
有三个指针(不是C里的物理指针)指向堆中的父结点和左右结点,分别是idx(父),left,right 。
还有一个largest指向 这三者中最大的那个。
如果,idx不等于largest,则交换 array[idx]和array[largets]的值,然后从largest开始向后递归。
注意:这只是完成一次,父>左右结点的操作,并不是整个排序完成,说到底,这个操作只是把小的数放到下面的叶子去了。
//buildHeap
排序的时候,从一半的位置向前调用Heapfy,因为一半的后面都是前面的子结点
以下程序部分借鉴 http://blog.csdn.net/moxiaomomo/article/details/6331386
#include <iostream>using namespace std;void Heapfy(int A[],int idx,int max) //建立最大堆 { int left=idx*2+1; int right=left+1; int largest; if(left<max&&A[left]>A[idx])largest=left; elselargest=idx; if(right<max&&A[largest]<A[right])largest=right; if(largest!=idx) { int temp=A[largest]; //较大的节点值将交换到其所在节点的父节点 A[largest]=A[idx]; A[idx]=temp; Heapfy(A,largest,max); //递归遍历 } } void buildHeap(int A[],int ll) { int len=ll; for(int i=len/2-1;i>=0;--i) //从一半的位置开始向前,因为一半后面的都是前面的子节点 { Heapfy(A,i,len); //建立最大堆,将堆中最大的值交换到根节点 } for(int i=len-1;i>=1;--i) { int temp=A[0]; //将当前堆的根节点交换到堆尾的指定位置 A[0]=A[i]; A[i]=temp; Heapfy(A,0,i); //建立下一次的最大堆 } } void show_array(int *a,int len){cout<<endl;for(int i=0;i<len;i++)cout<<a[i]<<"";cout<<endl;}int main(){int array[6]={18,10,9,22,1,3};show_array(array,6);buildHeap(array,6);show_array(array,6);return 0;}
阅读全文
0 1
- 算法(2)堆排序
- 排序算法(2)-堆排序
- 堆排序(最小堆)--【算法导论】
- 堆排序算法二(堆排序算法的应用)
- 常用算法(2)--选择排序&堆排序
- 算法之选择排序(2)——堆排序
- 堆排序(大根堆)算法
- 算法 - 堆排序(C#)
- 堆(Heap)排序算法
- 堆排序(算法导论)
- HeapSort(堆排序算法)
- 堆排序(算法导论)
- Java实现排序算法2:堆排序
- 排序算法(2)——堆排序
- 排序算法_3,堆排序2
- Java排序算法(三):堆排序
- 排序算法 之 堆排序(heapsort)
- 排序算法(三):堆排序
- matlab 高斯模糊非库函数实现方式
- Hive中的命令
- bzoj 1002 轮状病毒(高精度 + 找规律乱搞)
- 上海高级金融学院李晓阳教授:大数据带来思维变革
- Android隐藏输入法键盘(hideSoftInputFromInputMethod没有效果)
- 算法(2)堆排序
- 在示波器上快速、准确、完整的波形测量---凯利讯半导体
- java计算程序运行时间
- Eclipse同域请求配置
- redhat重设root密码
- ionic左滑删除
- 模块化程序设计之自顶向下、逐步求精
- 记忆,jQuery的click方法和on方法(on方法,有很多种使用,如on的change)?
- 无监督学习——kmeans