[算法导论]在一个数组中寻找最大值和最小值所需要进行比较的次数
2017-07-13 17:19
996 查看
数组大小为ArraySize,若ArraySize为偶数,则需要(n-2)/2×3+1次比较;若ArraySize位奇数,则需要(n-1)/2×3次比较。以两个数为一组,首先比较这两个的大小,然后分别与当前最小值和最大值比较。
#include <stdio.h> #include <stdlib.h> #include <time.h> #define MIN(a, b) ((a) < (b) ? (a) : (b)) #define MAX(a, b) ((a) > (b) ? (a) : (b)) #define GetMinAndMax(a, b, minimum, maximum, times) \ ({ \ unsigned int arg1 = (a); \ unsigned int arg2 = (b); \ (minimum) = MIN(arg1, arg2); \ (maximum) = MAX(arg1, arg2); \ (times)++; \ printf("time %3d: Compared %3d and %3d\n", times, arg1, arg2); \ }) #define ARRAY_SIZE 99 static int _Array[ARRAY_SIZE]; static void InitArray(void) { srand((unsigned int)time(NULL)); for(int i = 0; i < ARRAY_SIZE; i++) _Array[i] = rand() % (ARRAY_SIZE * 10); return; } static void PrintArray(void) { for(int i = 0; i < ARRAY_SIZE; i += 5) { printf("%d\t%d\t%d\t%d\t%d\n", _Array[i], _Array[i + 1], _Array[i + 2], _Array[i + 3], _Array[i + 4]); } return; } static void Findminimum(void) { unsigned int times = 0; int minimum; int maximum; int beginIndex; int tempMinimum; int tempMaximum; if(ARRAY_SIZE % 2 == 0) { GetMinAndMax(_Array[0], _Array[1], minimum, maximum, times); beginIndex = 2; } else { minimum = maximum = _Array[0]; beginIndex = 1; } for(int i = beginIndex; i < ARRAY_SIZE; i += 2) { GetMinAndMax(_Array[i], _Array[i + 1], tempMinimum, tempMaximum, times); GetMinAndMax(minimum, tempMinimum, minimum, tempMinimum, times); GetMinAndMax(tempMaximum, maximum, tempMaximum, maximum, times); } printf("Has compared %d times, and minimum is %d, maximum is %d\n", times, minimum, maximum); } int main(int argc, char * argv[]) { InitArray(); PrintArray(); Findminimum(); return EXIT_SUCCESS; }
相关文章推荐
- 算法8:一个整数数组里怎么同时找最大和最小的数,尽量优化比较次数
- 面试题--尽可能的减少求一个数组的最大最小值的比较次数
- 设计一个最优算法来查找一n个元素数组中的最大值和最小值。已知一种需要比较2n次的方法,请给一个更优的算法。
- 关于在一个无序数组中的数求最大值和最小值的最小比较次数
- 设计一个更优算法查找一n个元素数组中的最大值和最小值
- 求一个数组中的最大值和最小值,要求将比较次数减小至3N/2
- 算法习题45:对于一个整数矩阵,存在一种运算,对矩阵中任意元素加一时,需要其相邻(上下左右)某一个元素也加一;;;一个整数数组,长度为n,将其分为m份,使各份的和相等,求m的最大值
- 同时寻找最大数和最小数的最优算法以及寻找最大的两个数所需的最少比较次数
- 试着用最小的比较次数去寻找数组中的最大值和最小值。
- 设定二维整数数组B[0..m-1,0..n-1]的数据在行,列方向上都按从小到大的顺序排序,且整形变量x中的数据在B中存在。设计一个算法,找出一对满足B[i][j]=x的I,j值,要求比较次数不超过m
- 算法导论--寻找最大子数组
- 如何在比较1.5 len的次数下,找到整型数组最大最小值
- 如何用最少的比较次数找出一个数列的最大和最小值
- 找出数组中的最大和第二大元素需要进行几次比较?
- git是一种分布式代码管理工具,git通过树的形式记录文件的更改历史,比如: base'<--base<--A<--A' ^ | --- B<--B' 小米工程师常常需要寻找两个分支最近的分割点,即base.假设git 树是多叉树,请实现一个算法,计算git树上任意两点的最近分割点。 (假设git树节点数为n,用邻接矩阵的形式表示git树:字符串数组matrix包含n个字符串,每个字符串由字符'0
- [面试题]用最少的比较次数找出一个数组中的最大值和次大值
- 同时寻找最大数和最小数的最优算法以及寻找最大的两个数所需的最少比较次数
- 用递归二分法实现同时获得一个数组内的最大最小值
- 最坏情况下,合并两个大小为n的已排序数组所需要的比较次数
- 现在有一个数组,已知一个数出现的次数超过了一半,请用O(n)的复杂度的算法找出这个数