質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

ソート

複数のデータを、順序性に従って並べ替えること。 データ処理を行う際に頻繁に用いられ、多くのアルゴリズムが存在します。速度、容量、複雑さなどに違いがあり、高速性に特化したものにクイックソートがあります。

ポインタ

ポインタはアドレスを用いてメモリに格納された値を"参照する"変数です。

Q&A

2回答

1530閲覧

クイックソートがうまく実装できません><

ba_max009

総合スコア21

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

ソート

複数のデータを、順序性に従って並べ替えること。 データ処理を行う際に頻繁に用いられ、多くのアルゴリズムが存在します。速度、容量、複雑さなどに違いがあり、高速性に特化したものにクイックソートがあります。

ポインタ

ポインタはアドレスを用いてメモリに格納された値を"参照する"変数です。

0グッド

0クリップ

投稿2016/11/24 09:40

編集2016/11/24 10:37

###前提・実現したいこと
クイックソートを作りたいのですがうまくいきません。
課題なのですが、条件があり、このような書き方になっています。
条件
下記のアウトラインに沿って書け。

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

のようになっていました。

よろしくお願いします(><)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

if(r+1<n-1){sort(r,&a[l]);}の箇所を変更してみました。
(array_scanの部分は、当方に無いのではしょりました。)

c

1#include <stdio.h> 2#include <assert.h> 3#define MAX_N 64 4 5void sort(int n, double *a) 6{ 7 /* a[0]-a[n-1] を分割: p 以下の要素を a[] の前半に, p 以上の要素を後半に集める */ 8 int l = 0; /* 左端 */ 9 int r = n-1; /* 右端 */ 10 int p = a[0]; /* p として先頭要素を選ぶ */ 11 double tmp; 12 13 //printf("\n\n%d\n\n",p); 14 15 while(l<=r){ 16 while(a[l]<p){l++;} 17 while(a[r]>p){r--;} 18 if(l<=r){ 19 20 tmp=a[l]; 21 a[l]=a[r]; 22 a[r]=tmp; 23 24 l++; 25 r--; 26 } 27 } 28 /* 分割の結果, a[0]-a[r] が p 以下, a[l]-a[n-1] が p 以上になっている */ 29 30 if(0<l-1){sort(r+1,a);} 31 if(r+1<n-1){sort(n-l,&a[l]);} /* ここのみを変更しました */ 32 33} 34 35void array_print(int n, double *a) 36{ 37 int i; 38 for (i=0; i<n; i++) { 39 printf(" %0.1f", a[i]); 40 } 41 printf("\n"); 42} 43 44 45int main(void) 46{ 47 int n=5; 48 double a[MAX_N] = {3.0, 6.0, 5.0, 2.0, 1.0}; 49 //while ( 0 < (n = array_scan(a)) ) { 50 sort(n, a); 51 array_print(n, a); 52 //} 53 54 return 0; 55}

投稿2016/11/29 00:11

A.Ichi

総合スコア4070

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

(1),(2)の文が問題文の通りに実装されていないようです。それ以外は問題文の通りに見えました。
(1),(2)が問題文のとおりでないということは意識されていますか?もしそうならなぜ変えたのかを追記されてはいかがでしょうか。

なお質問文を編集しプログラムコードを```で囲んで字下げしましょう。

投稿2016/11/24 10:24

編集2016/11/24 10:43
KSwordOfHaste

総合スコア18394

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問