1. 程式人生 > >資料結構——遞迴法求解最大值和最小值

資料結構——遞迴法求解最大值和最小值

【遞迴法求解最大值和最小值】
問題描述:若一個無序的線性表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) ; }