打卡第十八天(问题:计算最大值最小值算法,折半查找)

1.计算最大值和最小值(分治法)

分治法计算最大值和最小值,是一个经典的算法程序。

原始数据使用随机函数生成。

采用结构化程序设计,可以很容易改为从标准输入或文件读入数据,只需要修改函数getData即可。

数据个数由宏定义给出,也可以轻松地改为输入。

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define N 7
void getData(int [],int);
void outputData(int [],int);
void maxmin1(int [],int);
void maxmin2(int [],int,int*,int*);
int max,min;
int main(void)
{
    int a[N];
    getData(a,N);
    outputData(a,N);
    maxmin1(a,N);
    printf("max=%d min=%d\n",max,min);
    return 0;
}
/*经典计算最大值和最小值的算法程序*/
void maxmin1(int d[],int n)
{
    int i;
    max=min=d[0];
    for(i=1;i<n;i++){
        if(d[i]>max)
        max=d[i];
        else if(d[i]<min)
        min=d[i];
    }
}
/*分治法计算最大值和最小值的算法程序,递归与实现*/
void maxmin2(int d[],int left,int right,int*max,int*min)
{
    int max1,min1;
    if(left==right){
        *max=d[left];
        *min=d[left];
    }
    else if(left==right-1){
        if(d[left]>d[right]){
            *max=d[left];
            *min=d[right];
        }
        else{
            *max=d[right];
            *min=d[left];
        }
    }
    else {
        int mid=(left+right)/2;
        maxmin2(d,left,mid,max,min);
        maxmin2(d,mid+1,right,&max1,&min1);
        if(*max<max1)
        *max=max1;
        if(*min>min1)
        *min=min1;
    }
 }
 void getData(int d[],int n)
 {
     time_t t;
     srand((unsigned) time(&t));/*设置随机数起始值*/
     int i;
     for(i=0;i<n;i++)
     d[i]=rand()%1000;/*获得0-999之间的整数值*/
 }
 void outputData(int d[],int n)
 {
     int i;
     for(i=0;i<n;i++)
     printf("%d",d[i]);
     printf("\n");
 }

2.折半查找(分治法)

Binary search algorithm

折半查找也称为二分查找,是一个经典的查找算法。

原始数据使用随机函数生成。

采用结构化程序设计,可以很容易改为从标准输入或文件读入数据,只需要修改函数getData即可。
数据个数由宏定义给出,也可以轻松地改为输入。

使用快速排序算法对原始数据进行排序。

这里给出递归和非递归两种过程实现折半查找,非递归的折半查找为正解。

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<quicksort.h>
#define N 7
void getData(int [],int);
void outputData(int [],int);
int binsearch1(int a[],int low,int high,int val);
int binsearch2(int a[],int low,int high,int val);
int mian(void)
{
    int a[N],i;
    getData(a,N);
    printf("Unordered datas: ");
    outputData(a,N);
    quicksort(a,0,N-1);
    printf("In sorted order: ");
    outputData(a,N);
    int index,val;
    scanf("%d",&val);
    index=binsearch1(a,0,N-1,val);
    if(index==-1)
    printf("There is no %d in arry A.\n",val);
    else
    printf("%d is at the %dth unit is arry A.\n",val,index);
    index=binsearch2(a,0,N-1,val);
    if(index==-1)
    {
        printf("There ids no %d in ARRY a.\n",val);
        else
        printf("%d is at the %dth unit is arry A.\n",val,index);
        return 0;
        
    }
    

 }
 int binsearch1(int a[],int low,int high,int val)
 {
     int mid;
     if(low>high)
     return -1;
     else
     {
         mid=(low+high)/2;
         if(a[mid]==val)
         return mid;
         else if(val>a[mid])
         return binsearch1(a,low,mid-1,val);
      }
  }
  int binsearch2(int a[],int low,int high,int val)
{
    int mid;
    for(;;)
    {
        if(low>high)
        return -1;
        else
        {
            mid=(low+high)/2;
            if(a[mid]==val)
            return mid;
            else if(val>a[mid])
            low=mid+1;
            else/*if(val<a[mid])*/
            high=mid-1;
        }
    }
}
void getData(int d[],int n)
{
    time_t t;
    srand((unsigned) time(&t));
    int i;
    for(i=0;i<n;i++)
    {
        d[i]=rand()%1000;
    }
    
}
void outputData(int d[],int n)
{
    int i;
    for(i=0;i<n;i++)
    printf("%d",d[i]);
    printf("\n");
}

猜你喜欢

转载自blog.csdn.net/huangluping12345/article/details/83017460