資料結構——遞迴法求解最大值和最小值
阿新 • • 發佈:2018-12-03
【遞迴法求解最大值和最小值】
問題描述:若一個無序的線性表A[MaxSize]採用順序儲存方式,元素型別為整型數。試寫出遞迴演算法求出A中的最大元素和最小元素。
要求: 順序表的資料通過呼叫演算法initRandomize()隨機產生。
#include <stdio.h>
#include <stdlib.h>
#define OK 1
#define ERROR 0
#define OVERFLOW -1
#define TRUE 1
#define FALSE 0
#define MAXSIZE 100
typedef struct Stack {
int data[MAXSIZE]; // 棧
int top; // 棧頂指標(實際是陣列的下標值)
} SqStack;
int InitStack(SqStack &S)
{
S.top=0;
}
int Push(SqStack &S,int e)
{
if(S.top>=MAXSIZE) return ERROR;
S.data[S.top++]=e;
return OK;
}
int Pop(SqStack &S,int &e)
{
if(S.top == 0) return ERROR;
e=S.data[--S.top];//e=*(S.data+S.top-1)
return OK;
}
int GetHead(SqStack &S,int &e)
{
if(S.top == 0) return ERROR;
e=S.data[S.top-1];//e=*(S.data+S.top-1)
return OK;
}
int Empty(SqStack &S)
{
if(S.top == 0) return 1;
else return 0;
}
int Full(SqStack S)
{
if(S.top == MAXSIZE) return 1;
else return 0;
}
#include <time.h>
void initRandomize(int *arr, int n, int min, int max)
{
int i = 0;
srand(time(0)); /*設定種子,並生成偽隨機序列*/
for (i = 0; i < n; ++i) {
arr[i] = rand()% (max - min + 1) + min; /*得到從[min, max]之間的隨機數*/
//arr[i] =rand();
//printf("%d ", arr[i]);
}
//printf("\n");
}
int bubble_max(SqStack &S)//這裡用引用會導致真實S順序變化
{
int i,j,temp;
for(i=1;i<=S.top-1;i++)//外層遍歷元素長度數-1
for(j=0;j<S.top-i;j++)//內層遍歷數從n-1、n-2......2、1(共n-1次,次數有外層控制)
{
if(S.data[j]>S.data[j+1])
{
temp=S.data[j];
S.data[j]=S.data[j+1];
S.data[j+1]=temp;
}
}
}
int bubble_min(SqStack &S)//這裡不用引用會導致真實S順序不改變
{
int i,j,temp;
for(i=1;i<=S.top-1;i++)//外層遍歷元素長度數-1
for(j=0;j<S.top-i;j++)//內層遍歷數從n-1、n-2......2、1(共n-1次,次數有外層控制)
{
if(S.data[j]<S.data[j+1])
{
temp=S.data[j];
S.data[j]=S.data[j+1];
S.data[j+1]=temp;
}
}
}
int recursion_max(SqStack &S,int i,int max)
{
if(i==S.top) return max;
if(S.data[i]>max)
{
max=S.data[i];
return recursion_max(S,++i,max);
}
return recursion_max(S,++i,max);
}
int recursion_min(SqStack &S,int i,int min)
{
if(i==S.top) return min;
if(S.data[i]<min)
{
min=S.data[i];
return recursion_min(S,++i,min);
}
return recursion_min(S,++i,min);
}
void test_bubble(SqStack S,int a[])
{
//Sleep(1000);
//initRandomize(&a[0], 11, 1, 1002);
int e;
for(int i=0;i<10;i++)
{
Push(S,a[i]);
}
bubble_min(S);
GetHead(S,e);
printf("最小值是%d \n",e);
bubble_max(S);
GetHead(S,e);
printf("最大值是%d \n",e);
}
void test_recursion(SqStack S,int a[])
{
int e;
for(int i=0;i<10;i++)
{
Push(S,a[i]);
}
printf("最大值是%d \n",recursion_max(S,1,S.data[0]));
printf("最小值是%d \n",recursion_min(S,1,S.data[0]));
while(!Empty(S))
{
Pop(S,e);
printf("%d ",e);
}
printf("\n");
}
int main()
{
SqStack S;
int a[11],i,e;
initRandomize(&a[0], 10, 1, 1002);
InitStack(S);
for(i=0;i<10;i++)
{
Push(S,a[i]);
}
while(!Empty(S))
{
Pop(S,e);
printf("%d ",e);
}
printf("\n");
//test_bubble(S,a);
test_recursion(S,a) ;
}