算法-排序-k排序(算法导论第三版第八章思考题8-5)

算法-排序-k排序

算法导论第三版第八章思考题8-5
时间复杂度Θ(nlg(n/k))。
利用最小堆完成,把元素分成k个堆,每个堆大小⌈n/k⌉。
利用堆作为子排序稳定,也可以采用其他排序作为子排序,子排序的算法时间复杂度保证在Θ(klgk)就行。

#include "k_sort_heap.h"
int left_k_sort(int parent)
{return (parent << 1) + 1;
}
int right_k_sort(int parent)
{return (parent << 1) + 2;
}
void heapify_k_sort(int *array,int heap_size,int parent_index)
{int smallest = parent_index;int left = left_k_sort(parent_index);int right = right_k_sort(parent_index);if(left < heap_size && array[left]< array[smallest]){smallest = left;}if(right < heap_size && array[right] < array[smallest]){smallest = right;}if(smallest != parent_index){int temp = array[parent_index];array[parent_index] = array[smallest];array[smallest] = temp;heapify_k_sort(array,heap_size,smallest);}
}
void build_k_sort_heap(int *array,int length)
{for (int i = length/2 - 1; i >=0; --i) {heapify_k_sort(array,length,i);}
}
int extra_minimum(int *array,int & heap_size)
{int minimum = array[0];array[0] = array[heap_size-1];heap_size--;heapify_k_sort(array,heap_size,0);return minimum;
}
void k_sort(int *array,int length,int k)
{int initial_heap_size = length/k + (length % k == 0 ? 0 : 1);int *heap = new int [initial_heap_size];int current_heap_size = 0;for (int i = 0; i < k; ++i) {for (int j = 0; j < initial_heap_size; ++j){if(i + (j * k) < length){heap[j] = array[i + (j * k)];current_heap_size++;}}build_k_sort_heap(heap,current_heap_size);int j = 0;while (current_heap_size>0){array[i + (j * k)] = extra_minimum(heap,current_heap_size);j++;}}delete[] heap;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/309085.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用 nuget server 的 API 来实现搜索安装 nuget 包

使用 nuget server 的 API 来实现搜索安装 nuget 包Intronuget 现在几乎是 dotnet 开发不可缺少的一部分了&#xff0c;还没有用过 nuget 的就有点落后时代了&#xff0c;还不快用起来nuget 是 dotnet 里的包管理机制&#xff0c;类似于前端的 npm &#xff0c;php 的 composer…

找出第二小元素(算法导论第三版9.1-1题)

找出第二小元素&#xff08;算法导论第三版9.1-1题&#xff09; 时间复杂度Θ(n) 比较次数n⌈lgn⌉−2次 思路&#xff1a;将元素每次分成2部分&#xff0c;第一部分和第二部分元素成对比较。最终获得最小的元素&#xff0c;记录那些和最小元素比较后的失败的元素&#xff0c;…

Kubernetes:通过自动化节省IT预算的4种方法

导语大多数CIO和IT领导者都熟悉反复执行的任务“事半功倍”。在许多组织中&#xff0c;这都是现实&#xff0c;在各种其他因素&#xff08;例如宏观经济状况&#xff09;的影响下&#xff0c;这种趋势往往会起伏不定。正文有时&#xff0c;“用更少的钱做更多的事”可能会更准确…

找出最大值和最小值(算法导论第三版9.1-2)

找出最大值和最小值 &#xff08;算法导论第三版9.1-2) 在最坏的情况下&#xff0c;比较次数下界是⌈3n/2⌉−2 void find_maximum_and_minimum_element(int *array,int length,int &max,int &min){int remainder length % 2;int start_index 0;if(remainder){//奇…

《Unit Testing》1.4. 成功的测试套件拥有哪些属性?

什么造就了成功的测试套件如果测量测试套件的质量&#xff1f;唯一可行的办法就是对测试套件里每一个测试进行单独的评估。你不需要一次性把它们都评估完。你可以逐步的进行评估成功的测试套件拥有以下属性&#xff1a;集成到开发周期中只针对代码库中最重要的部分它以最低的成…

找出数组中第i小元素(时间复杂度Θ(n)--最坏情况为线性的选择算法

找出数组中第i小元素 期望时间复杂度&#xff1a;Θ(n) 最坏情况的时间复杂度Θ(n^2) int randomized_select(int *array,int start,int end,int index){if(start end)return array[start];int middle randomized_partition(array,start,end);int position middle - start…

C# 9.0 终于来了, Top-level programs 和 Partial Methods 两大新特性探究

一&#xff1a;背景1. 讲故事.NET 5 终于在 6月25日 发布了第六个预览版&#xff0c;随之而来的是更多的新特性加入到了 C# 9 Preview 中&#xff0c;这个系列也可以继续往下写了&#xff0c;废话不多说&#xff0c;今天来看一下 Top-level programs 和 Extending Partial Meth…

4位BCD计数器设计

状态转换: 输出函数: 4位BCD计数器设计:

[Mvp.Blazor] 集成Ids4,实现统一授权认证

&#xff08;又一个客户端集成了IdentityServer4&#xff09;还是很开心的&#xff0c;目前已经有六个开源项目都集成到了Ids4认证中心了。1、Blazor系列文章回顾书接上文&#xff0c;关于Blazor学习呢&#xff0c;我也发了几篇文章了&#xff0c;我一般写东西都喜欢偏实战&…

重学ASP.NET Core 中的标记帮助程序

标记帮助程序是什么标记帮助程序使服务器端代码可以在 Razor 文件中参与创建和呈现 HTML 元素。 例如&#xff0c;内置的 ImageTagHelper 可以将版本号追加到图片名称。 每当图片发生变化时&#xff0c;服务器都会为图像生成一个新的唯一版本号&#xff0c;因此客户端总能获得…

小型数字系统---运动码表设计

运动码表设计中码表控制器是最难的&#xff0c;所以主要介绍如何设计码表控制器。 我们先给这个时序电路设计状态以及编码 先设计状态转换函数 首先画出状态图: (其中我们让其一到000状态就立马变为001状态&#xff0c;110状态存储完数据立马变成100状态) 根据状态图&#…

用 aforge.net 小试一下验证码识别

今天来小玩一下 aforge.net 套用官方的话就是一个专门为开发者和研究者基于C#框架设计的&#xff0c;这个框架提供了不同的类库和关于类库的资源&#xff0c;还有很多应用程序例子&#xff0c;包括计算机视觉与人工智能&#xff0c;图像处理&#xff0c;神经网络&#xff0c;遗…

国标转区位码电路设计及汉字显示

区位码国际码-2020H&#xff0c;由于采用加法器实现&#xff0c;因此用补码形式进行表示&#xff0c;区位码 国际码FFFF-2020H0001H国际码dfe0。 从网上找下机内码转化的软件&#xff0c;将一段自选文字输入该软件&#xff0c;进行十六进制的机内码转化。由于一个汉字是由四个十…

【WPF】DataGrid多表头的样式设计

需求在使用WPF开发时&#xff0c;使用DataGrid列表显示数据时&#xff0c;有些字段可以进行分组显示&#xff0c;用于更好的表达它们之间存在的某种关系&#xff0c;因此就考虑到要对DataGrid的表头进行扩展&#xff0c;可以显示多行表头&#xff0c;让这些有关联的字段内容显示…

异步清零和同步置数/清零的区别

同步&#xff0c;异步是对于时钟而言的。 同步指的是&#xff0c;状态的变化需要等待时钟有效沿来触发&#xff0c;所有动作同时跟随这个时钟变化&#xff0c;而异步时&#xff0c;状态变化不依赖与时钟。 异步清零说的是&#xff0c;你需要对一个计数器在满足某种条件时想要…