给定一个含n个整数顺序存储的线性表,按分治法思路,采用二分策略,设计一个求出其最大值和最小值算法,编写相应测试程序。要求使用分治法设计出其中求最大值、最小值组合的递归算法。
样例">输入样例:
100 2 3 -2 -8 -6 -9 -10 50 2 -1
输出样例:
-10,100
代码如下:
#include <stdio.h>
#include <stdlib.h>
typedef struct node {
struct node *next;
int data;
}Node;
Node *_createNode() {
Node *p;
p = (Node*)malloc(sizeof(Node));
p -> next = NULL;
return p;
}
int _search(Node *pList,int start,int end,int flag) {
Node *List;
List = pList -> next;
int mid;//中间值
int max1,max2;//左右分别的最大值
//如果左边界等于右边界返回这个值
if(start == end) {
for(int i = 1; i < start; i++) {
List = List -> next;
}
return List -> data;
}
//比较n/2前与n/2后的大小
else {
mid = (start + end) / 2;
max1 = _search(pList,start,mid,flag);
max2 = _search(pList,mid + 1,end,flag);
}
if(flag == 0)
return max1 > max2 ? max1 : max2;
else
return max1 < max2 ? max1 : max2;
}
//_destroy
void _destroy(Node *List) {
Node *p = List;
while(p) {
List = List -> next;
free(p);
p = List;
}
}
int main()
{
int max;
int min;
int count = 0;
//创建一个链表
Node *List = _createNode();
Node *ptail;
ptail = List -> next;
//输入数据
int num;
do {
scanf("%d",&num);
Node *pnew = _createNode();
pnew -> data = num;
if(ptail == NULL) {
List -> next = pnew;
ptail = pnew;
}
else if(ptail != NULL) {
ptail -> next = pnew;
ptail = pnew;
}
count++;
}
while(getchar() == ' ');
//查找(0找最大,1找最小)
max = _search(List,1,count,0);//(头节点,start,end)
min = _search(List,1,count,1);
//打印
printf("%d,%d",max,min);
//销毁
_destroy(List);
return 0;
}