配列要素から基準値(pivot)をランダムに選び、K番目に小さい要素を検索するプログラムを書いているのですが、うまくいきません。かなり考えているのですが、何が間違っているのか全然わかりません。どなたか教えていただけないでしょうか?
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int pivotpoint;
void partition3(int *s,int low,int high,int *pivotpoint)
{
int i,j,randspot;
int tmp;
int pivotitem;
randspot=rand()%(high+1);
pivotitem=s[randspot];
j=low;
for(i=low+1;i<=high;i++){
if(s[i]<pivotitem){
j++;
tmp=s[i];
s[i]=s[j];
s[j]=tmp;
}
}
*pivotpoint=j;
tmp=s[low];
s[low]=s[*pivotpoint];
s[*pivotpoint]=tmp;
}
int selection3(int *s,int low,int high,int k)
{
if(low==high)
return s[low];
else{
partition3(s,low,high,&pivotpoint);
if(k==pivotpoint)
return s[pivotpoint];
else if(k<pivotpoint)
return selection3(s,low,pivotpoint-1,k);
else
return selection3(s,pivotpoint+1,high,k);
}
}
main()
{
int num,i,k;
int high;
int low=0;
int s[1000];
struct timeval t1,t2;
int seed=2;
printf("How many elements?:");
scanf("%d",&high);
printf("?n");
printf("What is the kth smallest number?:");
scanf("%d",&k);
printf("?n");
srand(seed);
for(i=0;i<high;i++){
s[i]=rand();
printf("%d ",s[i]);
}
printf("?n");
gettimeofday(&t1,0);
num=selection3(s,low,high-1,k-1);
gettimeofday(&t2,0);
printf("Time=%dmicrosec?n", t2.tv_usec-t1.tv_usec);
printf("The %dth smallest is %d?n ", k,num);
}
お礼
レスかなり遅れてもうしわけございませんでした。 keikanさんの意見を参考にしてみたら、できました。 ありがとうございました。