はじめまして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:クイックソートを実装できません。
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;
}
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;
}