堆排序算法实现(最小堆)
最小堆排序1
#include <stdio.h>
#include<string.h>
#include<stdlib.h>
#include<time.h>
const int MAX = 0x3f3f3f3f;
const int maxn = 1000;
typedef struct HeapStruct *MinHeap;
struct HeapStruct {int data[maxn];int Size;int Capacity;
};//堆MinHeap Creat(int maxsize)//建最小堆
{MinHeap H =(MinHeap)malloc(sizeof(struct HeapStruct));H->Size=0;H->Capacity=maxsize;H->data[0]=-MAX;return H;
}int IsFull(MinHeap H)//判断堆是否为满
{if(H->Size==H->Capacity)return 1;else return 0;
}int IsEmpty(MinHeap H)//判断堆是否为空
{if(H->Size != 0 )return 0;else return 1;
}void Insert(MinHeap H ,int x)//插入
{int i;if(IsFull(H)){printf("It is full");return ;}i=++H->Size;for (;H->data[i/2]>x;i/=2){H->data[i]=H->data[i/2];}H->data[i]=x;
}int DelectMin(MinHeap &H)//取出
{int p,c,minitem,temp;if (IsEmpty(H)){printf("It is empty");return 0;}minitem=H->data[1];temp=H->data[H->Size--];for (p=1;p*2<=H->Size;p=c){c=p*2;if((c!=H->Size)&&(H->data[c]>H->data[c+1]))c++;if (temp<=H->data[c])break;else H->data[p]=H->data[c];}H->data[p]=temp;return minitem;
}
int main(){int n,s,sum=1;// freopen("C:/Users/111/Desktop/text/input.txt", "r", stdin);// freopen("C:/Users/111/Desktop/text/output.txt", "w", stdout);while(~scanf("%d",&n),n!=-1){int a[maxn];MinHeap H;H=Creat(maxn);for (int i = 0 ; i < n ; ++i){scanf("%d",&s);Insert(H,s);}printf("Case%d:%d\n",sum,n);for (int i = 0 ; i < n ; ++i){printf("%d ",DelectMin(H));}printf("\n");sum++;}// fclose(stdin);//关闭重定向输入// fclose(stdout);//关闭重定向输出 return 0;
}
最小堆排序2
#include <stdio.h>
#include<string.h>
#include<stdlib.h>
#include<time.h>
const int MAX = 0x3f3f3f3f;
const int maxn = 1000;
typedef struct HeapStruct *MinHeap;
struct HeapStruct {int data[maxn];int Size;int Capacity;
};//堆MinHeap Creat(int maxsize)//建堆
{MinHeap H =(MinHeap)malloc(sizeof(struct HeapStruct));H->Size=0;H->Capacity=maxsize;H->data[0]=-MAX;return H;
}int IsFull(MinHeap H)//判断堆是否为满
{if(H->Size==H->Capacity)return 1;else return 0;
}int IsEmpty(MinHeap H)//判断堆是否为空
{if(H->Size != 0 )return 0;else return 1;
}void Insert(MinHeap H ,int x)//插入
{int i;if(IsFull(H)){printf("It is full");return ;}i=++H->Size;H->data[i]=x;
}void PercDown(MinHeap H ,int i)//下滤
{int p,c;int x;x=H->data[i];for (p=i;p*2<=H->Size;p=c){c=p*2;if(c!=H->Size&&H->data[c]>H->data[c+1])c++;if(H->data[c]>=x)break;else H->data[p]=H->data[c];}H->data[p]=x;
}void buildheap(MinHeap H)//建最小堆
{int i;for (i=H->Size/2;i>0;i--){PercDown(H,i);}
}int DelectMin(MinHeap &H)//取出
{int p,c,minitem,temp;if (IsEmpty(H)){printf("It is empty");return 0;}minitem=H->data[1];temp=H->data[H->Size--];for (p=1;p*2<=H->Size;p=c){c=p*2;if((c!=H->Size)&&(H->data[c]>H->data[c+1]))c++;if (temp<=H->data[c])break;else H->data[p]=H->data[c];}H->data[p]=temp;return minitem;
}
int main(){int n,s,sum=1;// freopen("E:/c++/input.txt", "r", stdin);// freopen("E:/c++/output.txt", "w", stdout);while(~scanf("%d",&n),n!=-1){int a[maxn];MinHeap H;H=Creat(maxn);for (int i = 0 ; i < n ; ++i){scanf("%d",&s);Insert(H,s);}buildheap(H);printf("Case%d:%d\n",sum,n);for (int i = 0 ; i < n ; ++i){printf("%d ",DelectMin(H));}printf("\n");sum++;}// fclose(stdin);//关闭重定向输入// fclose(stdout);//关闭重定向输出 return 0;
}
堆排序算法实现(最小堆)相关推荐
- 贪心算法之最小堆实现霍夫曼编码
贪心算法之最小堆实现霍夫曼编码 实现之前需要学习的地方: 如果你不了解堆.堆的插入.堆的删除,可以先看下我前面几篇博客 http://blog.csdn.net/u011068702/article/ ...
- java 最小堆_堆排序 最大堆 最小堆 Java 实现
堆 一点疑惑,堆排序是就地排序,所以空间复杂度是 O(1).但是,比如我有一个数组,建立一个最小堆,然后每次取出最小堆的顶点.建立最小堆需要额外空间? 不深究了,归并排序需要额外空间. 堆是完全二叉树 ...
- Dijkstra算法与其最小堆优化
(仿佛回到了当年打比赛的时候呢 POJ 3013(Big Christmas Tree) 传送门:http://poj.org/problem?id=3013 题目大意:由一堆顶点和边构造出一棵圣诞树 ...
- 大顶堆删除最大值_C++|使用STL算法创建、调整、输出最大堆、最小堆
最大堆(又叫大根堆.大顶堆)和最小堆是二叉堆的两种形式,一类很重要的数据结构,如用于堆排序等. 最小堆:根结点的键值是所有堆结点键值中最小者,且每个结点的值都比其孩子的值小. 最大堆:根结点的键值是所 ...
- 排序算法(五)——堆排序算法详解及Python实现
本文目录 一.简介 二.算法介绍 三.代码实现 排序算法系列--相关文章 一.简介 堆排序(Heap Sort)算法,属于选择排序类,不稳定排序,时间复杂度O(nlogn). 堆排序由Floyd和Wi ...
- 堆排序算法原理及c++实现
文章目录 准备知识 MAX-HEAPIFY过程 建堆 堆排序算法 总结 准备知识 堆的结构可以分为最大堆和最小堆,是一个完全二叉树,而堆排序是根据堆的这种数据结构设计的一种排序. 所谓完全二叉树即叶节 ...
- 白话经典算法系列之七 堆与堆排序
堆排序与高速排序,归并排序一样都是时间复杂度为O(N*logN)的几种常见排序方法.学习堆排序前,先解说下什么是数据结构中的二叉堆. 二叉堆的定义 二叉堆是全然二叉树或者是近似全然二叉树. 二叉堆满 ...
- python实现最大堆,最小堆和堆排序
目录 0.什么是堆 1.最大堆的实现 2.最小堆的实现 3.堆排序 0.什么是堆 小堆和大堆分为如下图: 堆需要满足的条件: 1. 必须是二叉树,且必须是完全二叉树 2. 各个父节点必须大于或小于左右 ...
- python堆排序算法_Python算法学习之堆和堆排序
什么是堆? 堆是一种完全二叉树(请你回顾下上一章的概念),有最大堆和最小堆两种.最大堆: 对于每个非叶子节点 V,V 的值都比它的两个孩子大,称为 最大堆特性(heap order property) ...
- python range倒序_Python算法学习之堆和堆排序
什么是堆? 堆是一种完全二叉树(请你回顾下上一章的概念),有最大堆和最小堆两种. 最大堆: 对于每个非叶子节点 V,V 的值都比它的两个孩子大,称为 最大堆特性(heap order property ...
最新文章
- EF检索中文失败的解决办法
- 《Linux调优工具oprofile的演示分析》
- scss里父选择器的标识符
- SAP CRM Fiori My note应用的note header设计
- SAP CRM 产品主数据搜索时的权限检查实现 - Product search authorization check
- 使用基于列表的表单控件
- 天逸ad一66da_深入解析天逸ad66d与ad66a哪个好?区别是?内幕评测吐槽
- 讨论下怎么能实现保证新闻时效性推荐算法机制
- [互联网面试笔试汇总C/C++-9] 实现赋值运算符函数-剑指offer
- 电气工程cad实用教程电子版_电气工程CAD实用教程 pdf epub mobi txt 下载
- 批处理FOR 中的Delims和Tokens总结
- 使用Zip命令进行本地提权(类Unix系统)
- tcp spurious retransmission
- 考研调剂 计算机科学 软件,四川大学计算机学院(软件学院)2020非全日制考研调剂信息...
- 初级信息处理技术员access教程_初级信息处理技术员如何备考?
- Jfinal学习(一)
- MAC使用Bootcamp安装win7
- 笔记本选购2018.9
- android9.0官方壁纸,Android 9.0 修改默认壁纸(主壁纸和wapppaper)
- python就业需要的技能_教你如何快速掌握Python就业技能