算法导论 第6章

6.5-3

 1 HEAP-MINIMUM(A)
 2   return A[1]
 3
 4 HEAP-EXTRACT-MIN(A)
 5   if A.heap-size < 1
 6       error "heap underflow"
 7   min = A[1]
 8   A[1] = A[A.heap-size]
 9   A.heap-size = A.heap-size - 1
10   MIN-HEAPIFY(A, 1)
11   return min
12
13 HEAP-DECREASE-KEY(A, i, key)
14     if key > A[i]
15         error "new key is biger than current key"
16     A[i] = key
17     while i < A.heap-size and A[PARENT(i)] > A[i]
18         exchange A[i] and A[PARENT(i)]
19         i = PARENT(i)
20
21 MIN-HEAP-INSERT(A, key)
22 A.heap-size = A.heap-size + 1
23 A[A.heap-size] = INT_MAX
24 HEAP-DECREASE-KEY(A, A.heap-size, key)

6.5-6

解答:在题目中通过交换变量A[i]与A[PARENT(i)]实现;通过借鉴插入排序的做法,令A[i] = A[PARENT(i)],直到A[PARENT(i)] > A[i], 然后再位置i上插入关键字。

6.5-7

队列的实现:以入队的时间作为关键字建立最小优先队列

栈的实现:以入队的时间作为关键字建立最大优先队列

6.5-8

假设为最大堆,在删除关键字A[i]后,由于要保持堆的结构性,选择A[A.heap-size]替代A[i];

1、若替代后,A[i] < A[PARENT(i)], 使用MAX-HEAPIFY(A, i)

2、若替代后,A[i] > A[PARENT(i)], 使用上滤技术

 1 Input: A max-heap and an integers i
 2 Output: The heap A with element a position i delete
 3
 4 A[i] = A[A.heap-size]
 5 A.heap-size = A.heap-size - 1
 6 key = A[i]
 7 if key <= A[PARENT(i)]
 8     MAX-HEAPIFY(A, i)
 9 else
10     while i > 1 and A.[PARENT(i)] < key
11         A[i] = A[PARENT(i)]
12         i = PARENT(i)
13     A[i] = key

6.5-9

解答:

1、选择k个链表的第一个元素入最小堆

2、将堆中的最小元素放入排序的表中,再在最小元素所在的链表中选择下一个元素加入最小堆中

3、重复如此,直到排序完成

时间: 2024-10-11 13:22:39

算法导论 第6章的相关文章

算法导论 第13章 红黑树

二叉查找树的基本操作包括搜索.插入.删除.取最大和最小值等都能够在O(h)时间复杂度内实现,因此能在期望时间O(lgn)下实现,但是二叉查找树的平衡性在这些操作中并没有得到维护,因此其高度可能会变得很高,当其高度较高时,而二叉查找树的性能就未必比链表好了,所以二叉查找树的集合操作是期望时间O(lgn),最坏情况下为O(n). 红黑树也是一种二叉查找树,它拥有二叉查找树的性质,同时红黑树还有其它一些特殊性质,这使得红黑树的动态集合基本操作在最坏情况下也为O(lgn),红黑树通过给节点增加颜色和其它

算法导论 第6章 堆排序

堆数据结构实际上是一种数组对象,是以数组的形式存储的,但是它可以被视为一颗完全二叉树,因此又叫二叉堆.堆分为以下两种类型: 大顶堆:父结点的值不小于其子结点的值,堆顶元素最大 小顶堆:父结点的值不大于其子结点的值,堆顶元素最小 堆排序的时间复杂度跟合并排序一样,都是O(nlgn),但是合并排序不是原地排序(原地排序:在排序过程中,只有常数个元素是保存在数组以外的空间),合并排序的所有元素都被拷贝到另外的数组空间中去,而堆排序是一个原地排序算法. 1.在堆排序中,我们通常使用大顶堆来实现,由于堆在

算法导论 第6章 堆排序(简单选择排序、堆排序)

堆数据结构实际上是一种数组对象,是以数组的形式存储的,可是它能够被视为一颗全然二叉树,因此又叫二叉堆.堆分为下面两种类型: 大顶堆:父结点的值不小于其子结点的值,堆顶元素最大 小顶堆:父结点的值不大于其子结点的值,堆顶元素最小 堆排序的时间复杂度跟合并排序一样,都是O(nlgn),可是合并排序不是原地排序(原地排序:在排序过程中,仅仅有常数个元素是保存在数组以外的空间),合并排序的全部元素都被复制到另外的数组空间中去,而堆排序是一个原地排序算法. 1.在堆排序中,我们通常使用大顶堆来实现,因为堆

算法导论 第8章 线性时间排序

合并排序和堆排序的时间复杂度为O(nlgn),插入排序和冒泡排序的时间复杂度为O(n^2),快速排序的时间复杂度在平均情况下是O(nlgn),这些排序算法都是通过对元素进行相互比较从而确定顺序的,因此都叫比较排序. 比较排序可以看做是决策树(一个满二叉树),因为每一次比较都是一个分支.n个元素的序列,其排序的结果有 n! 种可能(n个元素的全排),所以这个决策树有 n! 个叶子结点,假设树的高度为h,则有:n! <= 2^h,所以h >= lg(n!) = Ω(nlgn).一次比较排序就是从决

算法导论 第7章 高速排序

高速排序在最坏情况下的时间复杂度为O(n^2),尽管在最坏情况下执行时间比較差,可是高速排序一般是用于排序的最佳选择.由于其平均性能相当好,期望的执行时间为O(nlgn),且在O(nlgn)的记号中隐含的常数因子非常小. 高速排序和合并排序有相似之处,都是须要划分序列,在合并排序中.划分的过程非常easy.直接选择元素序列的中间位划分位置,排序是在合并的过程中实现的,所以合并排序的合并过程非常重要.相比合并排序,高速排序就没有合并的过程.仅仅有划分,高速排序的划分过程非常重要,排序是在划分的过程

算法导论第7章___快速排序

快速排序本质上是插入排序,但是它在这个基础上增强了算法. 下面我们来分析一下快速排序: 有了前面的分析基础,我们在来看排序算法也就容易多了. public class Quick_Sort { private void quick_Sort(int []A,int left,int right){ if(left<right){ //划区比较,这个partition 第一次!得到的就是我们刚才说的2. int partition=partition(A, left, right); //实现第一

算法导论 第9章 中位数和顺序统计学

/* * 算法导论 第九章 中位数和顺序统计学 * 线性时间选择元素 */ #include <iostream> #include <ctime> using namespace std; int minimum(int *arr, int len); int randomizedSelect(int *arr, int p, int r, int i); int randomizedPartition(int *arr, int p, int r); void exchange

算法导论 第7章 快速排序

快速排序在最坏情况下的时间复杂度为O(n^2),虽然在最坏情况下运行时间比较差,但是快速排序通常是用于排序的最佳选择,因为其平均性能相当好,期望的运行时间为O(nlgn),且在O(nlgn)的记号中隐含的常数因子很小. 快速排序和合并排序有相似之处,都是需要划分序列,在合并排序中,划分的过程很简单,直接选择元素序列的中间位划分位置,排序是在合并的过程中实现的,所以合并排序的合并过程很重要:相比合并排序,快速排序就没有合并的过程,只有划分,快速排序的划分过程很重要,排序是在划分的过程中实现的. /

算法导论 第2章

本章主要是算法知识的基础讲解,介绍了循环不变式,几个简单的排序算法,递归分治算法等内容. 1.循环不变式 循环不变式主要用来说明算法的正确性,那么什么是循环不变式呢,其实就是在循环过程中,一些元素数据必须保持的一些性质,例如在插入排序中,数组为A,必须保证三个性质: (1) 初始化:在循环开始之前,循环不变式是成立的,即:A[0]是有序的,A[1...n-1]是无序的. (2) 保持:在循环的某一次迭代开始之前,循环不变式是成立的,那么在此次迭代结束后依然应该是成立的,即:A[0...i]是有序

算法导论_第二章(1)

年前的时候去逛书店,久仰算法导论这本书的大名看见后也就买了下来.回家看了一段时间,发现看书的进度真的是极慢,书里的课后题很多,那些不会的问题也是通过网上搜别人的答案才得以解决的.所以,我就想把我看这本书的心得连带课后的解答分享给大家.同时也是给我坚持把算法导论这本书看完的一个动力 ^_^ 因为本书的第一章相当于一个导论就直接跳过了,那么,从第二章开始! 第二章主要介绍了插入排序和归并排序: 所谓的插入排序就像是一局扑克刚开始时的摸牌阶段,你对手中的扑克所做的整理排序一样.开始时,我们的左手为空并