Странная проблема рекурсии возникает, когда 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;
}