一个面试题,求数组中第二大的数
来源:互联网 发布:c语言异或运算符 编辑:程序博客网 时间:2024/05/08 14:10
这个题如果按照最笨的方法,起泡法,第二遍的时候就能把第二大的数求出来,但是效率太低了,为 O(2n)
根据所学的锦标赛法
先分 N 组,两个元素一组 可能得到 N/2 或者 N/2+1组,大的元素交换到头,然后再比较剩下的一半
然后两两比较,继续 分下去,最后能决出第一名
而第二名应该从 索引为 1 2 3 (索引从0开始),而在进入决赛的时候,第一名将令一名淘汰了,和亚军争第一,那么第二名只能在亚军和冠军淘汰的那人中产生。
于是有了下面的算法。
这个算法的效率为 N/2+N/4+N/8+....+1 应该为 O(n) ,然后再比较1,2,3 得出第二名,所以算法的效率为 O(n) 比上面O(2n)快一倍
#include <stdio.h>/* * 求数组中第二大的数 */void swap(int &a,int &b){ int t = a;a = b; b = t;}int Second_Number(int array[],int count){ int N = count; int n ; int result = 0; while(true) { n = N%2?(N/2+1):(N/2); for(int i=0;i<n;i++) { if(array[i]<array[n-1-i]) { swap(array[i],array[n-1-i]); } } if(n==1){break;} N = n; } result = array[1]; for(int i = 2;i<3;i++) { if(result<array[i]) { result = array[i]; } } return result;}int main(){ int array[]={23,2,45,22,33,4,6,8,21,87}; printf("second number = %d \n",Second_Number(array,sizeof(array)/sizeof(array[0])));}
- 一个面试题,求数组中第二大的数
- C++面试题之写一个函数找出一个整数数组中,第二大的数
- 求一个数组中第二大的数
- 求一个整数数组中第二大的数
- 求数组中第二大的数
- 求数组中第二大的数
- 求数组中第二大的数
- 求数组中第二大的数
- 【我解C语言面试题系列】012 查找整数数组中第二大的数
- C语言面试题 4 (查找整数数组中第二大的数)
- C++面试题--寻找32位整数数组中第二大的数
- 有一个整数数组,求数组中第二大的数
- 给你一个整型的数组,求第二大的数
- 求一个整型数组第二大的数
- 求一个数组中的第二大的数?
- 重新开始战斗14-编程之美-求一个数组中第二大的数
- 求无序数组中第二大的数--快速选择
- 面试题—— 找出一个无序整型数组中第k大的数。
- 读书笔记
- 常用OCR软件介绍
- Map comparison
- 你所不知道的C++ 之 C++模板的部分实例化
- 第十一次实验报告
- 一个面试题,求数组中第二大的数
- 使用StringIO
- jsoup解析html
- 第十一次上机
- dos和linux换行符区别
- Android菜鸟开发之蓝牙(Bluetooth)---设置应用源码分析
- The Perceptron Algorithm
- Oracle体系结构及备份(十三)——bg-pmon
- [VC++] OCX控件之HTML加载