`
tangyuan1314
  • 浏览: 39787 次
  • 性别: Icon_minigender_2
  • 来自: 南京
社区版块
存档分类
最新评论

数据结构----堆(2)

 
阅读更多

堆1中介绍了堆的定义性质以及建堆过程,这篇主要介绍堆排序以及堆的一种应用---优先级队列

1、堆排序

堆排序算法,先用build_max_heap将输入数组A[0,...,n-1]建立一个最大堆。因为数组中最大元素在A[0],则可以通过交换A[0]和A[n-1],此时将最大数A[n-1]存入结果数组result中,并将此节点去掉,此时数组就剩下A[0,...,n-2],由于互换,新的根元素可能违背了最大堆的性质,此时再调用建堆子程序Max_heapify(A,0)保持此性质,在A[0,...,n-2]中构造最大堆。不断递归这个过程,堆的大小从n-1降到1。c语言程序如下://堆排序

void heap_sort(int nums[],int len){
    //首先建一个大根堆
	build_max_heap(nums,len);
	int *result = new int[len];//存放排好序的数组

	for(int i=len-1;i>=1;i--){
	    *result++=nums[0];//最大数一直在根上,赋值 后,移除最大元素
		nums[0]=nums[i];//从最后一个元素开始遍历,将其移到根部,并执行保持最大堆子程序,找到去除最大元素的次大元素,以此类推
		max_heapify(nums,i,0);
	}
	*result=nums[0];

}

分析此算法:建堆运行时间O(n),循环n-1次,每次循环中执行O(log2^n)+c,因此总的运行时间为O(n)+(n-1)(O(log2^n)+c)=O(nlog2^n)

2、堆的一种应用---优先级队列

优先级队列是一种用来维护一组元素构成的集合S的数据结构,每一个元素有一个关键字key。分为最大优先级队列和最小优先级队列。一个最大优先级队列支持一下操作:

(1)maximum(S):返回S中最大关键字的元素

(2)extract_max(S):去掉并返回S中最大关键字的元素

(3)increase_key(S,x,k):将元素x的关键字的值增加到k,这里k值不能小于x的原关键字的值

(4)insert(S,x):将元素x插入集合S

最大优先级队列的一个应用是一台分时计算机上进行作业调度。队列对要执行的作业以及优先级进行记录并调度。当一个作业完成时或者中断时,可用extract_max操作从所有等待的作业中,选出一个优先级最高的作业来执行。

优先级队列可以用堆来实现。

几个操作实现如下:

 

//返回nums中具有最大关键字的元素
int maximum(int nums[],int len){
    return nums[0];
}
//去掉,并返回nums中具有最大关键字的元素
int  extract_max(int nums[],int len){
    if(len<1){
	   cout<<"error:heap underflow"<<endl;
	}
	int max=nums[0];
	nums[0]=nums[len-1];
	nums[len-1]=NULL;
	max_heapify2(nums,len-1,0);
	return max;
}
//将nums[index]的关键字的值增加到key,增加后将其移到合适的位置,使其满足最大堆
void increase_key(int nums[],int len,int index,int key){
	if(key<nums[index]){
	   cout<<"error:new key is smaller than current key"<<endl;
	}
	nums[index]=key;
	int parent_index=(index-1)/2;
	int temp=0;
	while(index>=0&&nums[index]>nums[parent_index]){//类似插入排序
	     temp=nums[index];
		 nums[index]=nums[parent_index];
		 nums[parent_index]=temp;
		 index=parent_index;
		 parent_index=(index-1)/2;
	}
  
}
//将x插入最大堆的适合位置,首先加入负无穷的叶子节点,然后调用increase_key()设置新节点的值并移到合适位置
void insert(int nums[],int len,int x){
   int key=INT_MIN;
   nums=(int *)realloc(nums,len+1);
   nums[len]=key;
   increase_key(nums,len+1,len,x);
}

 分析四种操作:第一种操作:O(1)第2、3、4操作:O(log2^n)

 

 

分享到:
评论

相关推荐

    湖南大学-数据结构-期末试题【2016-2019】.zip

    数据结构是计算机科学中的核心课程,它探讨了如何在计算机中高效地组织和管理数据,以便于进行各种操作。湖南大学的数据结构期末试题涵盖了这门课程的重要概念和技术,旨在检验学生对这些知识的理解和应用能力。以下...

    数据结构-抽象数据类型-树

    数据结构是计算机科学中的核心概念,它涉及到如何高效地存储和组织数据,以便于执行各种操作。在数据结构中,树是一种非线性的数据结构,它模拟了自然界中树的概念,具有分层和父子关系的特点。在本压缩包中,我们...

    华科数据结构课程设计 数据结构-huffman

    在“数据结构-huffman”这个项目中,你可能会学习到如何使用编程语言实现上述步骤,例如使用Python的heapq库来构建最小堆。同时,你还会涉及到如何读取和写入哈夫曼编码文件,以及如何对原始文本进行编码和解码。 ...

    数据结构-----------课件

    第一部分,DSB_2_-_.ppt,主要讲述了线性数据结构。线性数据结构包括数组、链表、栈和队列等。数组是最基本的数据结构,提供了随机访问元素的能力,但插入和删除操作较为困难。链表则解决了这个问题,允许在任意位置...

    数据结构-二叉树的创建与遍历方法实现方式.docx

    相关链接 二叉树的基础知识点:数据结构-----树和二叉树的定义与性质_Gretel Tade的博客-CSDN博客堆的相关方法代码实现:数据结构-----堆(完全二叉树)_Gretel Tade的博客-CSDN博客二叉树的链式存储结构 #include...

    数据结构--课件.rar----帮您搞定数据结构

    树形结构是数据结构中的重要组成部分,包括二叉树、平衡树和堆。二叉树每个节点最多有两个子节点,可以用于实现查找和排序。平衡树,如AVL树和红黑树,确保了搜索效率的最优化。堆是一种特殊的树形结构,常用于优先...

    数据结构-优先队列-堆排序

    如题。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

    数据结构--严蔚敏--实现程序

    2. **链表**:链表是由一系列节点组成的数据结构,每个节点包含数据和指向下一个节点的指针。链表允许在任意位置插入和删除元素,但在随机访问元素时效率较低。 3. **栈**:栈是一种后进先出(LIFO)的数据结构,常...

    TP-1860实用数据结构-佟维

    在实际应用方面,佟维教授可能会讲解数据结构在排序算法(如快速排序、归并排序、堆排序等)和查找算法(如二分查找、哈希查找)中的应用。这些算法与数据结构的结合,可以极大地提高程序的运行效率。 此外,课程...

    数据结构---堆排序

    比较详细地讲述了堆排序的思路和代码实现,适合初学者

    山东大学软件学院2018-2019 数据结构真题

    数据结构是计算机科学中的核心课程,它探讨了如何在计算机中高效地组织和操作数据。在山东大学软件学院2018-2019的数据结构考试中,涉及了线性结构、层次结构和网状结构这三个关键概念。 **线性结构**: 1. 线性表...

    数据结构-java实现一个简单的最小堆结构SimpleHeap

    数据结构-java实现一个简单的最小堆结构SimpleHeap,展示了如何使用数组来实现最小堆,实现了最小堆的基本操作:插入和删除。insert 方法将元素添加到堆中,并调用 siftUp 方法来维护堆的性质。remove 方法删除堆顶...

    数据结构--严蔚敏(c语言版)

    - **堆排序**:利用堆这种数据结构所设计的一种排序算法,分为建堆和调整两个阶段。 - **归并排序**:同样基于分治法思想,将数组分成两半,递归地对每一半进行排序,然后合并结果。 ### 综合分析比较 本书不仅介绍...

    数据结构-------敢死队问题的4中实现方法

    二叉堆是一种自平衡的数据结构,可以确保在O(log n)的时间内完成操作,对于大数据集尤其有效。 4. **并查集(Disjoint Set)实现**: 并查集用于处理集合的合并与查询问题。在这个问题中,我们可以将每个成员视为...

    基础数据结构----刘汝佳

    二叉堆是一种树形数据结构,可以分为最大堆和最小堆。在二叉堆中,父节点的值总是大于或小于其子节点的值,这使得堆顶元素总是最大或最小值。二叉堆常用于实现优先级队列,以及在算法中作为辅助数据结构。 ### 并查...

    《数据结构-堆排序》

    《数据结构》严蔚敏版 堆排序

    数据结构--用c语言描述

    数据结构是计算机科学中的核心概念,它涉及到如何高效地存储和组织数据,以便于执行各种操作。在本章中,我们将探讨用C语言实现的数据结构,特别是几种不同的排序算法。 首先,排序是数据处理中常见且重要的任务,...

    数据结构-------二叉树

    二叉树是计算机科学中数据结构的一个重要概念,它在许多算法和问题解决中发挥着核心作用。在数据结构的世界里,二叉树是一种特殊的树形结构,其中每个节点最多有两个子节点,通常称为左子节点和右子节点。这种结构...

    数据结构-二叉树

    二叉树是计算机科学中一种重要的数据结构,它在很多算法和问题解决中扮演着核心角色。本资料主要探讨了二叉树的基本概念、实现方式以及遍历方法。 首先,我们要理解二叉树的基本定义。二叉树是由节点(或称为顶点)...

Global site tag (gtag.js) - Google Analytics