※ 引述《losepacific (Losepacific)》之銘言:
: ※ 引述《Neisseria (Neisseria)》之銘言:
: : 不預先將陣列排序的話,大概就是 O(n)
: : 以下提供一個 C 的版本:
: : #include <assert.h>
: : #include <stddef.h>
: : // Yet another linear search.
: : #define max(sz, arr, out) do { \
: : if (sz <= 1) { \
: : out = arr[0]; \
: : break; \
: : } \
: : out = arr[0]; \
: : size_t i; \
: : for (i = 1; i < sz; i++) { \
: : out = arr[i] > out ? arr[i] : out; \
: : } \
: : } while (0);
: : int main(void) {
: : int arr_i[] = {4, 2, 5, 1, 3};
: : int max_i;
: : max(5, arr_i, max_i);
: : assert(max_i == 5);
: : float arr_f[] = {2.2, 3.3, 1.1, 5.5, 4.4};
: : float max_f;
: : max(5, arr_f, max_f);
: : assert(max_f == 5.5);
: : return 0;
: : }
: : 這是寫好玩的,考試不要這樣寫,這樣只是在搞自己
: : 有寫過一些 C 的就知道原因
: 看了大大的程式碼才想到有可能會遇到小數。
: 所以修改了自己之前寫的程式碼,改完如下:
: #include <stdio.h>
: #include <stdlib.h>
: float max(char**, int);
: int main(int argc, char* argv[]){
: printf("%f\n", max(argv+1, argc-1));
: return 0;
: }
: float max(char** ap, int limit){
: if (limit == 1) return atof(*ap) ;
: float tmp;
: return atof(*ap) > (tmp = max(ap+1, limit-1)) ? atof(*ap) : tmp;
: }
再修改:
#include <stdio.h>
#include <stdlib.h>
float max(char**, int);
int main(int argc, char* argv[]){
if (argc > 1) printf("%f\n", max(argv+1, argc-1));
return 0;
}
float max(char** ap, int limit){
if (limit == 1) return atof(*ap) ;
float a, b;
int frontside = limit/2;
int backside = limit-frontside;
return (a=max(ap, frontside)) >= (b=max(ap+frontside, backside))?a:b;
}
不過,浮點數很不可靠,測試的狀況如下:
$ ./max 1 2 3 4.5 4 5 5.3 123213.131231 23.323 132424345655.6
132424343552.000000