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

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

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

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

ソート

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

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

Q&A

解決済

2回答

2265閲覧

文字列をクイックソートしたいです

jump110

総合スコア10

C

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

ソート

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

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

0グッド

0クリップ

投稿2021/06/23 01:41

c

1#include <stdio.h> 2#include <string.h> 3void jisho(char *a[],int left,int right){ 4 int i,j; 5 if(left + 1>right) return; 6 char*pivot = a[left+1]; 7 i=left; 8 j=right; 9 while(1){ 10 while(strcmp(a[i],pivot)) ++i; 11 while(strcmp(a[j],pivot)) --j; 12 if(i<j){ 13 char *t=a[i]; 14 a[i]=a[j]; 15 a[j]=t; 16 ++i; 17 --j; 18 }else if(j<=i){ 19 break; 20 } 21 } 22 if(j+1<right) jisho(a,j+1,right); 23 if(left<i-1) jisho(a,left,i-1); 24} 25int main(void) 26{ 27 char *firstName[] = { 28 "lucy","ethel","irene","dylan","jesse","ellen","randy", 29 }; 30 int i; 31 jisho(firstName, 0, 6); 32 for (i = 0; i < 7; ++i) { 33 printf("%s, ", firstName[i]); 34 } 35 printf("\n"); 36 return 0; 37} 38

文字列を辞書順にソートするプログラムを書きたいと思っています。数字のソートはできたのでそれをベースに文字列でのソートを仕方を調べながら書いてみたのですが実行しても順番が入れ替わっていませんでした。エラーなども発生していません。入れ替わらない理由と改善点を教えていただきたいです。

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

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

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

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

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

BeatStar

2021/06/23 01:47

課題とかではなく、単にクイックソートしたいだけならqsort関数を使った方が早いと思いますよ。 仮に自分で実装するにしても『デバッグをしましょう』です。 プログラミングは『書いて終わり』ではなく、デバッグやテストまで含みます。 プロでもデバッグぐらいはします。
guest

回答2

0

「クイックソートを実装したい」のでなければ、標準関数 qsort を使う。

C

1#include <stdio.h> 2#include <string.h> 3#include <stdlib.h> 4 5int compare(const void* x, const void* y) { 6 return strcmp(*(const char**)x, *(const char**)y); 7} 8 9int main(void) 10{ 11 char *firstName[] = { 12 "lucy","ethel","irene","dylan","jesse","ellen","randy", 13 }; 14 int i; 15 qsort(firstName, 7, sizeof(char*), compare); 16 17 for (i = 0; i < 7; ++i) { 18 printf("%s, ", firstName[i]); 19 } 20 printf("\n"); 21 return 0; 22}

投稿2021/06/23 01:52

episteme

総合スコア16612

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

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

0

ベストアンサー

strcmp の仕様を調べてみてください。どうなっていますか?

diff

1- while(strcmp(a[i],pivot)) ++i; 2- while(strcmp(a[j],pivot)) --j; 3+ while(strcmp(a[i],pivot) < 0) ++i; 4+ while(strcmp(a[j],pivot) > 0) --j;

投稿2021/06/23 03:06

kazuma-s

総合スコア8224

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

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

jump110

2021/06/23 12:39

文字を比較するための関数なのに比較対象を置いてなかったのがダメだったんですね!教えていただきありがとうございました!!
kazuma-s

2021/06/23 12:52

何をとぼけたこと言っているんですか? 比較対象は a[i] と pivot です。その 2つを比較しているんです。 ダメだったのは比較結果の見方です。 strcmp の仕様を調べていないのですか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問