ページ 11

クイックソートを実装できません。

Posted: 2010年7月23日(金) 17:20
by aki
はじめましてakiといいます。

クイックソートを作っているんですが、うまくうごきません。
お手数ですが、誰か分かる方教えてください。データを添付できませんでした



#include <stdio.h>
# define N 32768
# define n 99

void myalgo(int data[/url],int begin,int end){

int kijyun,a,b,c;
int temp;

kijyun=data[(begin+end)/2];//真ん中を基準にして大きさを比べていく

a=begin;
b=end;


while(1){
temp=0;
//基準より大きいものを右に小さいものを左に置く
while(data[a]<kijyun){
a++;
}
while(data>kijyun){
b--;
}

if(a>=b){
break;
}

temp=data[a];
data[a]=data;
data=temp;

a++;
b--;

}

for(c=0;c<=n;c++){
printf("%d :",data[c]);
}
printf("\n");

if(begin<a-1){//左側を同様にして並べ直す。要素が一つになるまで
myalgo(data,begin,a);
}
if(b+1<end){//右側を同様にして並べ直す。要素が一つになるまで
myalgo(data,a+1,end);
}

}
int main(void)
{
int value, data[N], i=0, j;

while ((scanf("%d", &value)) != EOF)
data[i++] = value;

mtrace();
myalgo(data,0,n);
muntrace();

for (j=0; j<i; j++)
printf("%d\n", data[j]);
}

Re:クイックソートを実装できません。

Posted: 2010年7月23日(金) 20:19
by ドラ
main()で myalgo() を呼び出しているところがおかしいですね。
myalgo()で間違っているのは赤字の部分だけ・・・かなぁ。
クイックソートって発想法は単純ですが、自分で実装しようとすると意外と難しいですね。
テストできるようにmain()を書いておいたので十分テストして下さいね。
間違ってても私は責任取れませんので・・・

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <assert.h>
#define N 100
#define TEST 10

void myalgo(int data[/url], int begin, int end)
{
int kijyun,a,b,c;
int temp;

kijyun=data[(begin+end)/2]; //真ん中を基準にして大きさを比べていく

a=begin;
b=end;

while(1){
temp=0;
//基準より大きいものを右に小さいものを左に置く
while(data[a]<kijyun){
a++;
}
while(data>kijyun){
b--;
}

if(a>=b){
break;
}

temp=data[a];
data[a]=data;
data=temp;

a++;
b--;
}

//for(c=0;c<=n;c++){
// printf("%d :",data[c]);
//}
//printf("\n");

if(begin<a-1){//左側を同様にして並べ直す。要素が一つになるまで
//myalgo(data, begin, a);
myalgo(data, begin, a-1);
}
if(b+1<end){//右側を同様にして並べ直す。要素が一つになるまで
//myalgo(data, a+1, end);
myalgo(data, b+1, end);
}
}

void set(int p[/url])
{
int i;
for (i = 0; i < N; i++) p = rand()%100;
}

void print(const char mes[/url], const int p[/url])
{
int i;
printf("%s\n", mes);
for (i = 0; i < N; i++) printf("%d,", p);
putchar('\n');
}

void check(const int p[/url])
{
int i;
for (i = 1; i < N; i++) assert(p[i-1] <= p);
printf("---- OK -----\n");
fflush(stdout);
}

int main(void)
{
int data[N], i;

srand( (unsigned)time(NULL) );

for (i = 0; i < TEST; i++)
{
printf("\n【テスト%d回目】\n", i+1);
set(data);
print("ソート前", data);
myalgo(data, 0, N-1);
print("ソート後", data);
check(data);

printf("Enterキーを押して下さい。");
getchar();
}

return 0;
}

Re:クイックソートを実装できません。

Posted: 2010年7月24日(土) 00:07
by Dixq (管理人)
よければこちらもどうぞ^^

http://dixq.net/sort.html