堆排序
来源:互联网 发布:淘宝买iphone6s 编辑:程序博客网 时间:2024/05/18 02:56
堆排序:
什么是堆:是一种数据结构,逻辑上市一个完全二叉树,存储上个是个数组
性质:两种堆,最小堆和最大堆。任意结点的key值都比他的孩子结点所有孩子结点的key值大
完全二叉树:除了叶子结点的那一层,其他层都是满的,而且叶子结点的排布是从左到右排的
存储:逐层按从左到右的顺序存储在数组中。Size,length size<=length 数组最后一个元素的下表就是size,分配的空间是length
用途:堆排序、优先级队列
堆的基本操作:
给定任一数组,建立一个堆
优先级队列
性能:lgn
代码:
#include <iostream>
#include <limits.h>
#include <string.h>
#define MAMN 1000
using namespace std;
//对于子堆进行交换,形成子堆的最大堆
void MAX_HEAPIFY(int *A , int i , int size)
{
int l = 2*i;
int r = 2*i+1;
int largest=0;
if(l<=size&&A[l]>A[i])
largest = l;
else
largest = i;
if(r<=size&&A[r]>A[largest])
largest = r;
if(largest!=i){
swap(A[i] , A[largest]);
MAX_HEAPIFY(A,largest,size);
}
}
//建立一个最大堆
void BUILD_MAX_HEAP(int *A,int size)
{
for(int i=size/2 ; i>=1 ;i--)//且是从size/2开始,这是前任总结出来的规律
MAX_HEAPIFY(A,i,size);
}
//进行排序!!
void HEAPSORT(int *A,int size)
{
int len = size;
BUILD_MAX_HEAP(A,len);
for(int i=len ; i>0 ; i--){
swap(A[1],A[i]);
len-=1;
MAX_HEAPIFY(A , 1 , len);
}
}
int main()
{
int i=0,j=0;
int temp;
int *p;
int A[MAMN];
int size=0;
while(cin >> size){
for(i=1 ; i<=size ; i++){
cin >> A[i];
}
HEAPSORT(A,size);
for(i=1 ; i<=size ; i++){
cout << A[i]<< " ";
}
cout << endl;
}
return 0;
}
- 堆及堆排序
- 堆/堆排序特点
- 【二叉堆、堆排序】
- 二叉堆 & 堆排序
- 二叉堆 & 堆排序
- 堆与堆排序
- 堆与堆排序
- 堆与堆排序
- 堆与堆排序
- 堆与堆排序
- 堆与堆排序
- 堆和堆排序
- 堆排序(最大堆)
- 堆和堆排序
- 堆和堆排序
- 堆及堆排序
- 堆和堆排序
- 堆与堆排序
- 高斯日记
- 杯子测试(黑盒)----功能测试
- HttpURLConnection封装
- Glide解析-cache
- 找到RecyclerView最后一条数据||RecyclerView上拉加载||GridLayoutManger
- 堆排序
- 网路协议入门
- EXE4J生成的exe文件自动请求管理员权限(UAC)
- [Boolan] 这周的笔记
- 求直角三角形的个数
- Java中的反射与内省技术内幕
- 1005. 继续(3n+1)猜想 (25) python篇
- iOS javascrip和oc混编 互相调用
- Eclipse+Pydev+用于数据分析package安装过程中的问题解决