问题描述:给定一个有n个数的序列集,求最大值和最小值。
解题思路:首先想到的的做法是首先任意选两个值作为最小值和最大值。然后剩下的n-2个值分别于这两个值进行比较即可。这样总共要 比较2*(n-2)次。有没有更好的做法呢,在算法导论第九章利就给出了这样一种思路:首先任意选两个值作为最小值和最大值。当然,奇数数组和偶数数组有点不同,奇数数组选第一个既是最大值,也是最小值。偶数数组先比较第一对数组,得出最大最小值。然后再将剩下的数分成两两一组,先两两比较,然后把较小的与最小值比较,较大的与最大值比较。剩下的(n-2)/2组中,每一组只需比较3次即可。也就是3*(n-2)/2。比前面的方法要快一些。这个问题可能不难,但是我们要学的是这种解决问题的思路,从最简单的开始分析时间复杂度,学会找不同的方法俩解决问题,这就是我写着道题的目的。
代码实现:
#include <stdio.h> void findMaxMin(int arr[], int len); int main() { int arr[] = {10,2,1,9,4,3,6,7,8,5}; int len; len = sizeof(arr)/sizeof(int); findMaxMin(arr,len); return 0; } void findMaxMin(int arr[], int len) { int i,tmp,Max,Min; tmp = len % 2; //判断奇偶 if (tmp == 0) { Min = arr[0] > arr[1] ? arr[1] : arr[0]; Max = arr[0] > arr[1] ? arr[0] : arr[1]; i = 2; } else { Min = Max = arr[0]; i = 1; } for (; i < len; i+=2) { if (arr[i] > arr[i+1]) { Max = Max > arr[i] ? Max : arr[i]; Min = arr[i+1] > Min ? Min : arr[i+1]; } else { Max = Max > arr[i+1] ? Max : arr[i+1]; Min = arr[i] > Min ? Min : arr[i]; } } printf("Max:%d,Min:%d ",Max,Min); }
2013/6/17 22:03
接下来要做的就是学习算法导论第九章的中位数的知识,然后再求二维最近的点对的问题。好了,就这么愉快的决定了。