Вопрос рекурсии - PullRequest
       20

Вопрос рекурсии

0 голосов
/ 16 сентября 2018

Странная проблема рекурсии возникает, когда ans> k или ans k или ans

#include <ctime>
#include <algorithm>
#include <iostream>
#include <climits>

using namespace std;

int partition(int *a,int f,int l,int x);
int medians(int *array01,int first,int last,int k){
    int n=(last-first)+1;
    if(k>=0 && k<n){
        int i;
        int median[(n+4)/5];
        int piv,ans;
        for(i=0;i<n/5;i+=1){
            int start = 5*i;
            int end = start + 4;
            if(end>last){
                end = last;
                sort(array01+start,array01+start+end%5);
                median[i]=array01[(end%5)/2];
                break;
            }
            sort(array01+start,array01+start+end+1);
            median[i]=array01[(end+1)/2];
        }
        int sizemed=sizeof(median)/sizeof(int);
        if (sizemed>1){
            sort(median,median+n/10);
            piv=median[(n/10)/2];
        }else{
            piv=median[0];
        }
        ans=partition(array01,first,last,piv);
        if(ans==k){
            return array01[ans];
        }else if(ans<k){
            return medians(array01,first,piv-1,k);
        }else if(ans>k){
            return medians(array01,piv+1,last,k-ans+first-1);

        }
    }
    return INT_MAX;
}

int partition(int *a,int f,int l,int x){
    int i,j;
    for(i=f;i<l;i++){
        if(a[i]==x){
            break;
        }
    }
    swap(a[i],a[l]);
    i=0;
    for(j=f+1;j<=l-1;j++){
        if(a[j]<a[l]){
            i++;
            swap(a[i],a[j]);
        }
    }
    swap(a[i+1],a[l]);
    return i+1;
}

int main(){
    int k=3,size=7;
    int array[size];
    cout<<"Inside main"<<endl;

    srand((unsigned)time(NULL));
    for(int i=0;i<size;i++){
        array[i]=1+(rand()%100);
    }
    int *ptr=array;
    for(int i=0;i<size;i++){
        cout<<"the array is : "<<array[i]<<endl;
    }
    int smallest = medians(ptr,0,size-1,k-1);
    cout<<"The kth smallest number is :"<<smallest<<endl;
    return 0;
}
...