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

时间复杂度Θ(n)
比较次数n+⌈lgn⌉−2次

思路:将元素每次分成2部分,第一部分和第二部分元素成对比较。最终获得最小的元素,记录那些和最小元素比较后的失败的元素,第二小元素就在其中。
原理:第二小元素只有和最小元素比才会失败,其他元素和其比都它都能胜出。所以,第二小元素一定在那些和最小元素比较后失败的元素中。第二小元素一定能和最小元素比较,因为除了和最小元素比以外它都能胜出。

int find_second_smallest_element(int *array,int length){vector<int> new_win;vector<int> old_win;for (int i = 0; i < length; ++i) {old_win.push_back(i);}vector<vector<int>> loss(length);int current_length = length;int remainder ;int win_index,loss_index;while (current_length>1){remainder = current_length % 2;if(remainder!=0){new_win.push_back(old_win[current_length / 2]);}for (int i = 0; i < current_length/2; ++i){if(array[old_win[i]]<=array[old_win[current_length-i-1]]){win_index = old_win[i];loss_index = old_win[current_length-i-1];}else{win_index = old_win[current_length-i-1];loss_index = old_win[i];}new_win.push_back(win_index);loss[win_index].push_back(loss_index);}current_length = new_win.size();old_win.clear();for (int i = 0; i < new_win.size(); ++i) {old_win.push_back(new_win[i]);}new_win.clear();}int second_smallest = loss[win_index][0];for (int i = 1; i < loss[win_index].size(); ++i) {if(array[loss[win_index][i]] < array[second_smallest]){second_smallest =  loss[win_index][i];}}return array[second_smallest];
}

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

  1. 找出第i个小元素(算法导论第三版9.2-4题)

    找出第i个小元素(算法导论第三版9.2-4题) 期望时间复杂度:Θ(n) 最坏情况的时间复杂度Θ(n^2) int randomized_select_based_loop(int *array,in ...

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

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

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

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

  4. 找出有序数组X和Y中所有元素的中位数(X,Y分别含n个元素)(算法导论第三版9.3-8)

    找出有序数组X和Y中所有元素的中位数(X,Y分别含n个元素) (算法导论第三版9.3-8) 时间复杂度O(lgn) int find_median_two_ordered_arrays(int *ar ...

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

    找出最大值和最小值 (算法导论第三版9.1-2) 在最坏的情况下,比较次数下界是⌈3n/2⌉−2 void find_maximum_and_minimum_element(int *array,in ...

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

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

  7. 写出TREE-PREDECESSOR的伪代码(算法导论第三版12.2-3)

    写出TREE-PREDECESSOR的伪代码(算法导论第三版12.2-3) TREE-PREDECESSOR(x)if x.left != NILreturn TREE-MAXIMUM(x.left) ...

  8. 写出TREE-MINIMUM 和TREE-MAXIMUM的递归版本(算法导论第三版12.2-2)

    写出TREE-MINIMUM 和TREE-MAXIMUM的递归版本(算法导论第三版12.2-2) template<typename T> BinaryTreeNode<T>* ...

  9. 给定一个n节点二叉树,写出一个O(n)时间的非递归的过程,将该树每个结点的关键字输出(算法导论第三版第十章10.4-5)

    给定一个n节点二叉树,写出一个O(n)时间的非递归的过程,将该树每个结点的关键字输出.要求除该树本树的存储空间外只能使用固定量的额外存储空间,且过程中不得修改该树,即使是暂时的修改也不允许. (算法导 ...

最新文章

  1. C++中的封装、继承、多态
  2. Java黑皮书课后题第10章:*10.6(显示素数)编写一个程序,然后按降序显示小于120的所有素数。使用StackOfIntegers类存储这些素数,获取之后按逆序显示它们
  3. 如何在Chrome调试器里检查嵌套Observable对象
  4. a 中调用js的几种方法
  5. 【教程】javascript浏览器对象入门教程
  6. set.contains()分析
  7. 64位ubuntu能安装mysql数据库_Ubuntu操作系统下安装MySQL数据库的方法
  8. photon四种同步方式_Map 四种同步方式的性能比较
  9. docker php安装gd扩展_PHP安装AMQP扩展
  10. android pickerview 多行,Android PickerView实现三级联动效果
  11. 论文计算机制图,计算机制图教学设计运用论文
  12. 分辨西瓜和冬瓜的思考
  13. 将ubuntu光盘作为安装源_Ubuntu之apt-get光盘源配置小结
  14. Grounded theory相关知识
  15. 贴吧防删图应该怎么学?【万能的小胡】
  16. centos7:在linux世界里,一切皆文件
  17. PHP7有哪些新特性
  18. Java最新面试题100道,包含答案示例(41-50题)
  19. 新书推荐:《福格行为模型》
  20. 啊哈C!思考快你一步——用编程轻松提升逻辑力

热门文章

  1. NDVI最大值法MVC合成之ArcGIS Cell Statistics 实现
  2. Android之通过ContentResolver获取手机图片和视频的路径和生成缩略图和缩略图路径
  3. linux之tar命令使用总结
  4. Nginx指南和配置详解
  5. 【C语言简单说】七:自定义函数(1)
  6. 【C语言简单说】四:常量
  7. Android启动过程五个步骤,Android启动流程、app启动原理
  8. 飞信linux下载文件,OpenFetion(飞信for Linux)
  9. foreach循环符合就不往下走了_柴油发电机组冷却液循环故障解决方法
  10. 美女,你这是把腰带当裙子了?