###前提・実現したいこと
クイックソートを作りたいのですがうまくいきません。
課題なのですが、条件があり、このような書き方になっています。
条件
下記のアウトラインに沿って書け。
void sort(int n, double *a) { /* a[0]〜a[n-1] を分割: p 以下の要素を a[] の前半に, p 以上の要素を後半に集める */ l = 0; /* 左端 */ r = n-1; /* 右端 */ p = a[0]; /* p として先頭要素を選ぶ */ l ≤ r である間繰り返す { a[l]<p である間 l を 1 増やす; a[r]>p である間 r を1 減らす; もし l≤r ならば { a[l] とa[r] を交換; l を1 増やし, r を1 減らす; } } /* 分割の結果, a[0]〜a[r] が p 以下, a[l]〜a[n-1] が p 以上になっている */ 0<r ならば a[0]〜a[r] をソート (sort(??, ??) を呼び出す … (1)); l<n−1 ならば a[l]〜a[n-1] をソート (sort(??, ??) を呼び出す … (2)); }
###発生している問題・エラーメッセージ
エラーそのものは起こっていませんが、ソートがうまくなされません。
n = 5
[0] : 3
[1] : 6
[2] : 5
[3] : 2
[4] : 1
1.0 2.0 5.0 6.0 3.0
のような中途半端なソートになっています。
###該当のソースコード
include <stdio.h> #include <assert.h> #define MAX_N 64 void sort(int n, double *a)# { /* a[0]-a[n-1] を分割: p 以下の要素を a[] の前半に, p 以上の要素を後半に集める */ int l = 0; /* 左端 */ int r = n-1; /* 右端 */ int p = a[0]; /* p として先頭要素を選ぶ */ double tmp; //printf("\n\n%d\n\n",p); while(l<=r){ while(a[l]<p){l++;} while(a[r]>p){r--;} if(l<=r){ tmp=a[l]; a[l]=a[r]; a[r]=tmp; l++; r--; } } /* 分割の結果, a[0]-a[r] が p 以下, a[l]-a[n-1] が p 以上になっている */ if(0<l-1){sort(r+1,a);} if(r+1<n-1){sort(r,&a[l]);} } void array_print(int n, double *a) { int i; for (i=0; i<n; i++) { printf(" %0.1f", a[i]); } printf("\n"); } int main(void) { int n; double a[MAX_N]; while ( 0 < (n = array_scan(a)) ) { sort(n, a); array_print(n, a); } return 0; }
###試したこと
ソートの途中で基準がどうなっているのか表示したところ、
n = 5
[0] : 3
[1] : 2
[2] : 4
[3] : 6
[4] : 1
p=3
p=1
p=2
p=4
1.0 2.0 4.0 6.0 3.0
のようになっていました。
よろしくお願いします(><)
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。