最小堆排序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;
}

堆排序算法实现(最小堆)相关推荐

  1. 贪心算法之最小堆实现霍夫曼编码

    贪心算法之最小堆实现霍夫曼编码 实现之前需要学习的地方: 如果你不了解堆.堆的插入.堆的删除,可以先看下我前面几篇博客 http://blog.csdn.net/u011068702/article/ ...

  2. java 最小堆_堆排序 最大堆 最小堆 Java 实现

    堆 一点疑惑,堆排序是就地排序,所以空间复杂度是 O(1).但是,比如我有一个数组,建立一个最小堆,然后每次取出最小堆的顶点.建立最小堆需要额外空间? 不深究了,归并排序需要额外空间. 堆是完全二叉树 ...

  3. Dijkstra算法与其最小堆优化

    (仿佛回到了当年打比赛的时候呢 POJ 3013(Big Christmas Tree) 传送门:http://poj.org/problem?id=3013 题目大意:由一堆顶点和边构造出一棵圣诞树 ...

  4. 大顶堆删除最大值_C++|使用STL算法创建、调整、输出最大堆、最小堆

    最大堆(又叫大根堆.大顶堆)和最小堆是二叉堆的两种形式,一类很重要的数据结构,如用于堆排序等. 最小堆:根结点的键值是所有堆结点键值中最小者,且每个结点的值都比其孩子的值小. 最大堆:根结点的键值是所 ...

  5. 排序算法(五)——堆排序算法详解及Python实现

    本文目录 一.简介 二.算法介绍 三.代码实现 排序算法系列--相关文章 一.简介 堆排序(Heap Sort)算法,属于选择排序类,不稳定排序,时间复杂度O(nlogn). 堆排序由Floyd和Wi ...

  6. 堆排序算法原理及c++实现

    文章目录 准备知识 MAX-HEAPIFY过程 建堆 堆排序算法 总结 准备知识 堆的结构可以分为最大堆和最小堆,是一个完全二叉树,而堆排序是根据堆的这种数据结构设计的一种排序. 所谓完全二叉树即叶节 ...

  7. 白话经典算法系列之七 堆与堆排序

     堆排序与高速排序,归并排序一样都是时间复杂度为O(N*logN)的几种常见排序方法.学习堆排序前,先解说下什么是数据结构中的二叉堆. 二叉堆的定义 二叉堆是全然二叉树或者是近似全然二叉树. 二叉堆满 ...

  8. python实现最大堆,最小堆和堆排序

    目录 0.什么是堆 1.最大堆的实现 2.最小堆的实现 3.堆排序 0.什么是堆 小堆和大堆分为如下图: 堆需要满足的条件: 1. 必须是二叉树,且必须是完全二叉树 2. 各个父节点必须大于或小于左右 ...

  9. python堆排序算法_Python算法学习之堆和堆排序

    什么是堆? 堆是一种完全二叉树(请你回顾下上一章的概念),有最大堆和最小堆两种.最大堆: 对于每个非叶子节点 V,V 的值都比它的两个孩子大,称为 最大堆特性(heap order property) ...

  10. python range倒序_Python算法学习之堆和堆排序

    什么是堆? 堆是一种完全二叉树(请你回顾下上一章的概念),有最大堆和最小堆两种. 最大堆: 对于每个非叶子节点 V,V 的值都比它的两个孩子大,称为 最大堆特性(heap order property ...

最新文章

  1. EF检索中文失败的解决办法
  2. 《Linux调优工具oprofile的演示分析》
  3. scss里父选择器的标识符
  4. SAP CRM Fiori My note应用的note header设计
  5. SAP CRM 产品主数据搜索时的权限检查实现 - Product search authorization check
  6. 使用基于列表的表单控件
  7. 天逸ad一66da_深入解析天逸ad66d与ad66a哪个好?区别是?内幕评测吐槽
  8. 讨论下怎么能实现保证新闻时效性推荐算法机制
  9. [互联网面试笔试汇总C/C++-9] 实现赋值运算符函数-剑指offer
  10. 电气工程cad实用教程电子版_电气工程CAD实用教程 pdf epub mobi txt 下载
  11. 批处理FOR 中的Delims和Tokens总结
  12. 使用Zip命令进行本地提权(类Unix系统)
  13. tcp spurious retransmission
  14. 考研调剂 计算机科学 软件,四川大学计算机学院(软件学院)2020非全日制考研调剂信息...
  15. 初级信息处理技术员access教程_初级信息处理技术员如何备考?
  16. Jfinal学习(一)
  17. MAC使用Bootcamp安装win7
  18. 笔记本选购2018.9
  19. android9.0官方壁纸,Android 9.0 修改默认壁纸(主壁纸和wapppaper)
  20. python就业需要的技能_教你如何快速掌握Python就业技能

热门文章

  1. PHP利用JWT实现token和refresh_token
  2. Mini USB针脚定义
  3. donet 微服务开发 学习-AOP框架基础
  4. 晨曦记账本记账收支,统计结余
  5. C#实现对即插U盘文件的自动拷贝
  6. matlab动刚度仿真,基于ANSYS的转子支承动刚度计算分析.doc
  7. 计算机二级数据透视图教程,2019年9月 全国计算机二级 MS Office (Excel 图表和数据透视表)...
  8. C语言99乘法表,求指点
  9. eyoucms使用入门 三
  10. 如何在CentOS 7上安装Yarn