堆排序(大顶堆)
来源:互联网 发布:js汉字转unicode编码 编辑:程序博客网 时间:2024/06/10 23:15
一:堆
堆可以看做一个完全二叉树,同时该完全二叉树满足双亲结点大于等于孩子结点(大顶堆),或者双亲结点小于等于孩子结点(小顶堆)。
二:堆排序(以大顶堆为例)
大顶堆产生顺序序列,小顶堆产生逆序序列。
已知序列[a0,a1,…,an]。测试序列为{5,9,3,7,6,5};
a)将序列初始化,从最后面的非叶子结点开始调整产生大顶堆。
b)将a0和an交换,a0到an-1(无序区)不满足大顶堆则重新调整,an为有序区。(a0处保存的是无序区生成的子堆中的最大值。)
c)进行n-1次(b)步的调整,有序区将包含n-1个有序元素,最后一个元素即为最小元素。排序完成。
#include<iostream>using namespace std;void swap(int *a, int *b){ int temp = *a; *a = *b; *b = temp;}void HeadAdjust(int a[], int i, int length){ int lChild = 2*i+1; int rChild = 2*i+2; int max = i; if(i<=(length-1)/2) { if(lChild<=length-1 && a[lChild]>a[max]) { max = lChild; } if(rChild<=length-1 && a[rChild]>a[max]) { max = rChild; } if(max != i) { swap(&a[max],&a[i]); HeadAdjust(a,max,length); } }}void InitHead(int a[], int length){ for(int i=(length-1)/2;i>=0;i--) { HeadAdjust(a,i,length); }}void HeadSort(int a[], int length){ InitHead(a,length);// for(int i=0; i<length; i++)// {// cout<<a[i]<<" ";// } // cout<<endl; for(int i=length-1;i>0;i--) { swap(&a[0],&a[i]); HeadAdjust(a,0,i);// for(int i=0; i<length; i++)// {// cout<<a[i]<<" ";// } // cout<<endl; } }int main(){ int a[100] = {0}; int length=0; cin>>length; if(length>0) { for(int i=0; i<length; i++) { cin>>a[i]; } HeadSort(a,length); for(int i=0; i<length; i++) { cout<<a[i]<<" "; } cout<<endl; } return 0;}
运行结果:
阅读全文
0 0
- 堆排序(大顶堆)
- 堆排序,(大顶堆)
- 大顶堆(堆排序)
- 堆排序(大顶堆)
- 堆(堆排序)
- 堆排序(大顶堆->升序)
- 堆排序 (建立大顶堆)
- Java堆排序(大顶堆)
- Java堆排序(大顶堆)
- 选择排序之堆排序(大顶堆)
- 排序(堆排序)
- 二叉堆(堆排序)
- 堆排序(最小堆)
- (二叉堆,堆排序)
- 堆排序(最大堆)
- 堆排序(最大堆)
- 堆排序(最大堆)
- java写一个堆排序(大顶堆)
- 最大流问题的Ford-Fulkerson解法
- 用list_to_tree在ThinkPHP上制作一个简单的菜单功能
- 穿过已知点画平滑曲线(3次贝塞尔曲线)
- springmvc上传图片并显示图片--支持多图片上传- 转
- 给一个对象添加属性和方法的三种方案简单比较
- 堆排序(大顶堆)
- 对前端模块化的一些理解
- Spark SQL
- pid=4占用80端口
- HttpURLConnection用法详解
- 关于ReadFile函数错误:代码6,ERROR_INVALID_HANDLE
- USACO
- codeforces 61E 树状数组 逆向
- unity 拖动物体移动