算法-排序-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;
}

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

  1. 算法导论水壶问题(第三版第八章思考题8-4)

    算法导论水壶问题 (第三版第八章思考题8-4) 本算法只适用于解题,不通用. 期望的时间复杂度O(nlgn) Kettle.h文件 #ifndef C11LEARN_KETTLE_H #define ...

  2. 算法导论第三版第二章思考题答案

    算法导论第三版第二章思考题答案 第二章思考题 算法导论第三版第二章思考题答案 2.1 2.2 2.3 2.4 汇总传送门 2.1 #include<iostream> using name ...

  3. 带权中位数-算法导论第三版第九章思考题9-2

    带权中位数-算法导论第三版第九章思考题9-2 b 时间复杂度O(nlgn) float find_median_with_weights_b(float *array,int length) {qui ...

  4. 确定S中最接近中位数的k个元素(算法导论第三版9.3-7)

    确定S中最接近中位数的k个元素 (算法导论第三版9.3-7题) 时间复杂度O(n) vector<int> k_elements_closest_to_median(int *array, ...

  5. 利用链表实现可合并堆(算法导论第三版思考题10-2)

    利用链表实现可合并堆(算法导论第三版思考题10-2) a 链表已排序 创建一个空堆: Θ(1) 插入:Θ(n),插入后依然保持排序 最小值:Θ(1),第一位便是 取最小值:Θ(1) 合并:Θ(n),可 ...

  6. 算法导论第三版2.2答案

    算法导论第三版2.2答案 2.2 算法导论第三版2.2答案 2.2-1 2.2-2 2.2-3 2.2-4 汇总传送门 2.2-1 O(n3)O(n^3)O(n3) 2.2-2 /* * @Autho ...

  7. 算法导论第三版第十一章11.1-4

    算法导论第三版第十一章11.1-4 我们希望在一个非常大的数组上,通过利用直接寻址的方式来实现一个字典.开始时,该数组中可能包含一些无用信息,但要堆整个数组进行初始化时不太实际的,因为该数组的规模太大 ...

  8. 算法导论第三版2.3答案

    算法导论第三版2.3答案 2.3 算法导论第三版2.3答案 2.3-1 2.3-2 2.3-3 2.3-4 2.3-5 2.3-6 2.3-7 汇总传送门 2.3-1 划分: {3}, {41}, { ...

  9. 给出TREE_INSERT过程的非递归版本(算法导论第三版12.3-1)

    给出TREE_INSERT过程的非递归版本(算法导论第三版12.3-1) template<typename T> void insert_recursive(BinaryTree< ...

最新文章

  1. initramfs 文件系统
  2. IE7一样可以轻易重装
  3. 纪念音视频界前辈-雷霄骅
  4. 开机一直转圈_电脑开机后网络一直转圈,程序也打不开?
  5. Jaakko isalo谈《愤怒的小鸟》创意来源
  6. Matlab Tricks(五)—— shuffle 一个矩阵
  7. Linux 杀死stuck线程,如何中断weblogic中stuck thread
  8. 常见的java开源组件_java开源框架有哪些?Java常用开源框架
  9. Java通用数据访问层 Uncode-DAL
  10. 推荐几本经济金融类的图书
  11. 有个exe文件删不掉怎么办
  12. poco mysql 库_poco网络库
  13. 内网安全检测技术yyds!你还不会吗?
  14. HARK学习(三)--文件格式
  15. 中邮消费金融面试随笔
  16. SOLIDWORKS Electrical无缝集成电气和机械设计
  17. 炒币的诱惑、安稳的生活
  18. Vue:自定义组件引入单页面+动态绑定图片
  19. 微信小程序点击商品跳转商品详情页面的方法
  20. 标准立方米的单位换算

热门文章

  1. 从listView1中选择记录到listView2中
  2. Eclipse提示The **** cannot be resolved. It is indirectly referenced from required .cl
  3. linux网络编程之网络字节序、主机字节序、大端、小端
  4. linux之如何快速在文本里面写入内容
  5. 《零基础看得懂的C语言入门教程 》——(八)了解基本数组还不是那么简单
  6. 不同步节点在线使用Remix开发以太坊Dapp及solidity学习入门 ( 一 ):智能合约HelloWorld
  7. 据说很多女生都想知道男生是如何上厕所的?
  8. 波的折射现象,你都了解吗?
  9. 大开眼界!终于等到这部每一帧都是壁纸的纪录片!
  10. 一般将来时语法课教案_速看,如何在考场写出一篇脱颖而出的教案