【算法导论】同时求数组的最大值和最小值

        算法导论(第三版)第九章里提出过一个比较有意思的小问题:如何在最短的时间内求出一个n长数组中最大和最小问题。下面就来做一个实现。


        思路:


        ①把数组分成两个两个一组,然后先让子数组内部比较出一个大的和一个小的,然后最大值只跟子数组内的大值做比较,小值只跟子数组内的最小值做比较,如果发现符合的,则重新赋值。


        ②对于偶数的数组,按上面的就可以;对于奇数个数元素的数组而言,我们先让最大值和最小值都是第一个元素,然后再按照上面的来办


        ③时间复杂度:先将数组分成两个两个一组,组内进行比较为:O(n/2),然后让max和所有子组内的max比较是O(n/2),同样min的时候也是:O(n/2),所以总的算下来是O(3n/2)


        ok,思路比较简单,给出实现代码:



#include

using namespace std;

struct result {
	int max;
	int min;
};

/*
 * 求一个数组,位于start和end(包括start和end)位置之间的所有数的最大和最小值,时间复杂度为O(3*n/2)
 */
result* Get_Min_Max(int array[], int start, int end) {

	int len = end - start + 1;

	if (end < start) {
		return NULL;
	}

	result* res = new result();

	int max, min;

	if (len % 2 == 0) {
		//偶数的情况
		res->max =
				array[start] > array[start + 1] ?
						array[start] : array[start + 1];
		res->min =
				array[start] < array[start + 1] ?
						array[start] : array[start + 1];

		start = start + 2; //如果是偶数,则需要让i从第三个元素开始
	} else {
		//奇数的情况
		res->max = array[start];
		res->min = array[start];

		start = start + 1; //如果是奇数,则需要让i从第二个元素开始
	}

	while (start <= end) {
		max = array[start] > array[start + 1] ? array[start] : array[start + 1];
		min = array[start] < array[start + 1] ? array[start] : array[start + 1];

		res->max = res->max > max ? res->max : max;
		res->min = res->min < min ? res->min : min;

		start = start + 2;
	}

	return res;

}

int main() {

	int a[9] = { 5, 8, 0, -89, 9, 22, -1, -31, 98 };
	result* r1 = Get_Min_Max(a, 0, 8);
	cout << "最大值为:" << r1->max << ",最小值为:" << r1->min << endl;

	int b[10] = { 5, 8, 0, -89, 9, 22, -1, -31, 98, 2222 };
	result* r2 = Get_Min_Max(b, 0, 9);
	cout << "最大值为:" << r2->max << ",最小值为:" << r2->min << endl;

	delete r1;
	delete r2;

	return 0;
}

结果:

最大值为:98,最小值为:-89
最大值为:2222,最小值为:-89





你可能感兴趣的:(算法,算法导论)