分治法递归函数:
1 void PartionGet(int starA, int endA, int *meter, int *max, int *min)/* 分治法获取最优解 */ 2 { 3 /* 参数: 4 * s 当前分治段的开始下标 5 * e 当前分治段的结束下标 6 * meter 表的地址 7 * max 存储当前搜索到的最大值 8 * min 存储当前搜索到的最小值 */ 9 10 if (endA - starA <= 1) /* 获取局部解,并更新全局解 */ 11 { 12 if (meter[starA] > meter[endA]) 13 { 14 if (meter[starA] > *max) 15 { 16 *max = meter[starA]; 17 } 18 19 if (meter[endA] < *min) 20 { 21 *min = meter[endA]; 22 } 23 } 24 else 25 { 26 if (meter[endA] > *max) 27 { 28 *max = meter[endA]; 29 } 30 31 if (meter[starA] < *min) 32 { 33 *min = meter[starA]; 34 } 35 } 36 37 return; 38 } 39 40 int i; 41 i = starA + (endA - starA) / 2; /* 不是子问题继续分治,这里使用了二分,也可以是其它 */ 42 PartionGet(starA, i, meter, max, min); 43 PartionGet(i + 1, endA, meter, max, min); 44 }
调用
1 int main() 2 { 3 #define MM 30 4 int ii, meter[MM]; 5 int max = INT_MIN; /* 用最小值初始化 */ 6 int min = INT_MAX; /* 用最大值初始化 */ 7 printf("#define INT_MIN:%d INT_MAX:%d \n\n", INT_MIN, INT_MAX); 8 printf("The array‘s element as followed--->RAND_MAX:%d \n\n", RAND_MAX); 9 srand(time(0)); /* 初始化随机数发生器 */ 10 11 for (ii = 0; ii < MM; ii++) /* 随机数据填充数组 */ 12 { 13 meter[ii] = rand() % 10000; 14 15 if (!((ii + 1) % 10)) /* 输出表的随机数据,控制分行,首输出带换行*/ 16 { 17 printf("%-6d\n", meter[ii]); 18 } 19 else 20 { 21 printf("%-6d", meter[ii]); 22 } 23 } 24 25 PartionGet(0, MM - 1, meter, &max, &min); /* 分治法获取最值 */ 26 printf("\nMax : %d\nMin : %d\n", max, min); 27 printf("\n\n\n------------------------------------------------\n\n\n"); 28 system("pause"); 29 return 0; 30 31 }
原文:https://www.cnblogs.com/qq8533/p/12200148.html