• ベストアンサー

ソートプログラムについて

ソートプログラムとして以下のように作成しました。 int main( ) { int i, j, temp; int ten[10] = { 98,34,67,89,99,23,54,21,10,65 }; for (i=0; i< 9; i++) { for(j=i+1; j<10; j++) { if (ten[i] < ten[j]) { temp = ten[i]; ten[i] = ten[j]; ten[j] = temp; } } } for (i = 0; i < 10; i++) { printf("SORT[%d] = %d\n",i,ten[i]); } } このプログラムを昇順で同じ数字が入力された場合、出力表示として 例: SORT[1]=99 SORT[2]=98 SORT[2]=98 SORT[3]=89 SORT[4]=70 というようにしたいのですが、プログラムをどのように 書いていけば良いのかわかりません。 例のような出力にするにはどのようにすればいいのでしょうか 教えて下さい。

質問者が選んだベストアンサー

  • ベストアンサー
noname#48699
noname#48699
回答No.4

>回答いただいた以外で方法があるなら教えていただきたいのですが。 そこをご自身で考えるのが「楽しみ」なのですが、・・・。 その楽しみを年寄りがいただいて、2種類の表現方法を作ってみました。 (1)ゴルフ大会などの順位表現 SORT[1]=99 SORT[2]=98 SORT[2]=98 (2)ご要望 SORT[4]=89  ←[3] SORT[5]=70  ←[4] '//' を付け替えて実行してみて下さい。 iRank = 1; for( i = 0; i < 10; i++ ){  if( i ){ //  if( ten[i-1] != ten[i] ) iRank = i + 1; // (1)    if( ten[i-1] != ten[i] ) iRank++;  // (2)ご要望  }  printf( "SORT[%2d] = %d\n", iRank, ten[i] ); } } 注:タブの代わりに全角空白を用いています。

gogo340
質問者

お礼

参考にさせていただき、無事に出力表示できました。

その他の回答 (4)

noname#140971
noname#140971
回答No.5

JavaScript の回答ですが、実は、プログラミング言語C2の例題の回答そのものですよ。 3項演算子について調べられたら宜しいかと思います。

gogo340
質問者

お礼

ありがとうございます。 3項演算子について調べてみました、自分の思うような 出力ができました。

noname#140971
noname#140971
回答No.3

1=98 1=98 2=89 3=67 4=54 5=34 6=23 7=21 8=10 このような結果を得たいとのこと。 例えば、JavaScript では次のように書きます。 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN"> <html> <title>ソート</title> <meta http-equiv="Content-script-Type" content="type"> <script type="text/javascript"> function bsort(v) {   var i, j;   for (i=0;i<8;i++) {      for (j=i+1; j<9; j++) {        if (v[i] < v[j]) {          swap(v, i, j);        }      }    } } function swap (v, i, j) {   var temp;   temp = v[i];   v[i] = v[j];   v[j] = temp; } </script> <body> <script> <!--   var v = new Array("98","34","67","89","98","23","54","21","10","65");   var i;   var k;   bsort(v);   k=0;   for (i = 0; i < 9; i++) {     (i>0 && (v[i] == v[i-1]) ? 0: k++);     document.write(k, "=");     document.write(v[i], "<br/>");    } //--> </script> </body> </html> 問題は、C言語で  (i>0 && (v[i] == v[i-1]) ? 0: k++);  という書き方が許されるかです。 許されるような許されないような???

gogo340
質問者

補足

ここまで書いていただいて申し訳ないのですが、 C言語ではどのように書くのでしょうか? 回答いただいた以外で方法があるなら教えていただきたいのですが。

  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.2

> >添え字(SORT[%d])用の変数を用意したほうが良いでしょう > なぜ用意するのでしょうか? for文によるループを制御するための変数iは0~9を 順にたどっていきますが、順位の値はiと必ずしも 等しくならないためです。

gogo340
質問者

お礼

表示の出力時になぜ別の変数を用いたのか確認できました。 ありがとうございます。

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

変更する部分は分かるのでしょうか? for (i = 0; i < 10; i++) {   printf("SORT[%d] = %d\n",i,ten[i]); } の部分を変更するのですが ・・・ どのような場合に 現在のiの部分を変えれば良いのか考えましょう まず i=0 の場合は無条件で1になる i>0の場合1つ前の配列tenの要素と見比べて同じならカウントアップしない 違うならカウントアップする ここまで説明すれば出来るでしょう 添え字(SORT[%d])用の変数を用意したほうが良いでしょう ちなみご質問のコードでは 表示の[]内は0から始まります

gogo340
質問者

お礼

変更部分をアドバイスをいただきながら、完成できました。 ありがとうございます。

gogo340
質問者

補足

ありがとうございます。 for (i = 0; i < 10; i++) { //この部分にカウントアップするかしないかの 条件を付ければよいのでしょうか?//   printf("SORT[%d] = %d\n",i,ten[i]); } >添え字(SORT[%d])用の変数を用意したほうが良いでしょう なぜ用意するのでしょうか?

関連するQ&A

  • ソートプログラム

    ファイルから10個の整数が 29 45 11 2 86 91 33 62 77 59 のように一行に1個の形式で格納されている。このファイルから10個の整数を読み込み、選択法でソートし、この数字を小さい順に表示するプログラムを作成したのですが、ソート部分がうまくできません。どなたかどうすれば改善できるか教えてください。 <プログラム> #include<stdio.h> #include<stdlib.h> #define MAXN 100 int A[MAXN]; main() { _inputdata(); _selectionsort(1,10); _printdata(); } selectionsort(p,q) ___int p, q; { _int i, j, cmin, temp; _for(j = p; j <= q; j++){ __cmin = j; /* A[cmin]が現在の最小値 */ __for(i = j+1; i <= q; i++) ___if(A[cmin] > A[i]) cmin = i; __/* A[j]とA[cmin]との入れ換え操作 */ __swap(j, cmin); _} } swap(int x, int y) { _int temp; _temp = x; _x = y; _y = temp; } inputdata() { _FILE *fp; _if((fp=fopen("integers10.dat", "r"))==NULL) { __printf("ファイルが見つかりません: integers10.dat\n"); __exit(EXIT_FAILURE); _} _printf("データを入力\n"); _while(fscanf(fp, "%s", A)!=EOF) { ____printf("%s\n",A); _} _fclose(fp); } <コンパイル→実行> % gcc -o sort1 sort1.c % ./sort1 データを入力 29 45 11 2 86 91 33 62 77 59 ソート済みデータ 0 0 0 0 0 0 0 0 0 0 %

  • 情報処理のバブルソートの問題について質問します。

    情報処理のバブルソートの問題について質問します。 #include <stdio.h> int main(void) { double x[5]={6.0, 9.0, 2.0, 10.0, 8.0}; int i,j; int n=5; double temp; /* 初期状態の表示 */ printf("並べ替え前の並びは以下の通り:\n"); for (i=0; i<n; i++) { printf("%f,\t",x[i]); } printf("\n"); for (i=0; i<n-1; i++) { for (j=i+1; j<n; j++) { if (x[j] > x[i]) { temp = x[i]; x[i]=x[j]; x[j]=temp; } } } printf("大きい順に並べ替えた結果は以下の通り:\n"); for (i=0; i<n; i++) { printf("%f,\t",x[i]); } printf("\n"); return 0; } というプログラムを用いて行ってみたのですが、 これは王様ソートというプログラムだと言われました。 どのように換えればバブルソートになるのでしょうか?

  • シェルソートのプログラムが分かりません

    教科書どおり下のようなプログラムを作ったのですが、ちゃんとソートされません。 打ち間違いなどを探しているのですが見つからないんです・・・ それと、プログラム11行目のj=j-hが何のためにあるのか分かりません。もしかしたら幼稚な質問かもしれませんがどうかよろしくお願いします。 #include<stdio.h> void shell(int n,int a[]) { int i,j,x,h; h=n/2; while(h<0) { for(i=h;i<=n;i++) { x=a[i]; for(j=i-h;j>=0;j=j-h) { if(a[j]>x) { a[j]=a[j+h]; a[j+h]=x; } } } h=h/2; } } main() { int a[]={30,20,60,29,10,90}; int n=6; int i; shell(n,a); for(i=0;i<n;i++) { printf("%4d",a[i]); } printf("\n"); }

  • C言語のソートプログラム

    学校でプログラミングの課題が出たので自分のパソコンに Microsoft Visual C++ 2010 Express をインストールして作ってみました。 それが以下のプログラムです。 これは任意の値nを入力してa[n]までの配列をつくり それを降順に並び替えるものです。 #include <stdio.h> #define N 10000 int main(){ int a[N],i,j,max,min,n,temp; n=0; printf("n="); scanf("%d",&n); if(N<n){ return 0; } else if(n<=0){ return 0; } else if(n<=N){ for(i=0;i<n;i++){ printf("a[%d]",i); scanf("%d",&a[i]); } max=min=a[0]; for(i=1;i<n;i++){ if(max<a[i]){ max=a[i]; } else if(min>a[i]){ min=a[i]; } } printf("a[i]のソート結果\n"); for(i=0;i<n;i++);{ for(j=i+1;j<n;j++){ if(a[i]<a[j]){ temp=a[i]; a[i]=a[j]; a[j]=temp; } } } for(i=0;i<n;i++){ printf("a[%2d]=%d\n",i,a[i]); } printf("Max=%d\n",max); printf("Min=%d\n",min); } } これを実行すると 最初に入力した配列の順番のまま表示されてしまいます。 例えば n=4 a[0]7 a[1]4 a[2]6 a[3]1 a[i]のソート結果 a[0]7 a[1]4 a[2]6 a[3]1 のようにです。 しかしプログラミング上では for(i=0;i<n;i++);{ for(j=i+1;j<n;j++){ if(a[i]<a[j]       temp=a[i];       a[i]=a[j];            a[j]=temp;        }        }        } のようにiとjを比較して a[0]がa[1]より大きければa[0]とa[1]を交換する。 あとはa[0]とa[2], a[0]とa[3]...a[3]とa[4]まで for文の続く限り繰り返すように書いたはずです。 まだ勉強し始めた私にはどこが間違っているのか分からないので 分かる方はご指摘をお願いします。

  • クイックソートプログラムでセグメンテーション違反がでるのですが

    クイックソートのプログラムを作成したのですが、 実行するとセグメンテーション違反が発生して、上手くいきません。何処に原因があるのでしょうか? また、セグメンテーションン違反とはどういったころなのでしょうか? アドバイス宜しくお願いします。 #include <stdio.h> int quick_sort(int *a,int start,int end); int partition(int *a,int start,int end); main() { int n; int a[n]; int i; printf("ソートしたい要素の個数は?\n"); scanf("%d",&n); for(i=0;i<=n-1;i++) a[i]=0; for(i=0;i<=n-1;i++){ printf("%dのデータを入力してください。\n",i+1); scanf("%d",&a[i]); } printf("ソート前のデータは以下の通り\n"); for(i=0;i<=n-1;i++) printf("%d ",a[i]); quick_sort(*a,1,n-1); printf("ソート後のデータは以下の通り\n"); for(i=0;i<=n-1;i++) printf("%d ",a[i]); } int quick_sort(int *a,int start,int end) { int pivot; if(end-start>0){ pivot=partition(a,start,end); quick_sort(a,start,pivot-1); quick_sort(a,pivot+1,end); } } int partition(int *a,int start,int end) { int i,j,pivot,tmp; i=start-1; j=end; pivot=a[end]; while(1){ while(a[++i]<pivot); while(i<--j && a[j]>pivot); if(i>=j) break; tmp=a[i]; a[i]=a[j]; a[j]=tmp; } a[end]=a[i]; a[i]=pivot; return i; }

  • Cでのバブルソートがよくわかりません

    C言語の課題でバブルソートのプログラミングをしています。入れるデータは10個で、降順に並び変えた最終的な結果だけでなく、毎回for文をまわす度にその時点での結果を表示させなければなりません。 そこで渡されたフローチャートを参考にしてプログラミングしてみたところ、以下のようになりました。しかしなかなか上手く行きません。C言語はまだまだ初心者なので、どなたかお力を貸していただけると助かります。 #include <stdio.h> main(){ int d[10] = {0,7,8,4,5,3,2,1,6,9}; int i,n,j,temp; for(i=1;i<j;i++){ for(j=1;j<=i;n--){ if(d[j]<d[j-1]){ temp=d[j]; d[j]=d[j-1]; d[j-1]=temp; } } for(i=0;i<=10;i++){ printf("%d ", d[i]); } } for(i=0;i<=10;i++){ printf("%d ", d[i]); } }

  • [C言語] 整数を昇順でソートする

    このサイト(http://www.kusa.ac.jp/~kajiura/c/hairetsu/newpage3.htm)で、整数を昇順でソートするソースコードが示されています。しかし、for文の中にfor文、その中にif文を用いた箇所が何を実行しているのか全く理解できません。どのような思考を持てばこのようなソースコードに到るのだろう、と困惑しています。自力で書いてみるつもりでしたが、2時間くらい考えて書けませんでした。もっと簡単な方法はないのでしょうか。 #include <stdio.h> #define SIZE 5 main() { int j, k, temp, x[SIZE]; printf("5個の整数を入力してください\n"); printf("昇順に並べ替えて出力します\n"); /* 入力 */ for(j = 0 ; j < SIZE ; j++) { printf("deta = "); scanf("%d", &x[j]); } /* 並べ替え */ for(j = 0 ; j < SIZE - 1; j++) for(k = j + 1; k < SIZE ; k++) if(x[j] > x[k]) { temp = x[j]; x[j] = x[k]; x[k] = temp; } /* 出力 */ for(j = 0; j < SIZE ; j++) printf("%d\n", x[j]); }

  • C言語をお願いします

    何が違うのか教えてください。 segmentation faultになります。 よく分からないので、プログラムを作っていただければ、助かります。 問 整数を入力し、降順並び変えてに表示。 ・入力した整数は配列に入れ、その配列を使って並び変える(入力終りの印は 1000 とする)。 ・入力する整数の個数は #define NUM 100 を使いなさい。 ・使うデータは、下記の例のように、キーボードから入力すること。 #include<stdio.h> #define NUM 100 int main(void){ int d[NUM]; int temp; int i,j,n; printf("Input scores.\n"); for(i=0; i<NUM && d[i]!=1000; i++){ scanf("%d",&d[i]); } n = i; for(i = 0; i < n; i++){ for(j = i + 1; j < n;j++){ if(d[j] > d[i]){ temp = d[i]; d[j] = d[i]; d[i] = temp; } } } printf("After sort."); for(i=0; i < n; i++){ printf("%d\n",d[i]); } return 0; } 実行例 Input scores. 60 30 45 90 100 0 1000 After sort. 100 90 60 45 30 0 よろしければ 問2 並び変えをする部分を mysort 関数にしたプログラムを作ってください。 main 関数から mysort 関数には点数の個数と sort 前の配列を渡し、並び変え結果の表示はmain 関数でお願いします。 (問題の意味が分かりません) 関数はさっぱり分かりません。 では、お願い致します。

  • C言語 ソートについて

    #include <stdio.h> #include <stdbool.h> #define NUM_ARRAY 4 #define NUM_DATA 5 int count_swap = 0; // 交換回数 int count_comparison = 0; // 比較回数 void selection_sort(int a[], int n) { } int main(void) { int data[NUM_ARRAY][NUM_DATA] = {{9, 7, 5, 6, 8}, {9, 8, 7, 6, 5}, {5, 6, 7, 8, 9}, {5, 6, 8, 7, 9}}; for (int i = 0; i < NUM_ARRAY; i++) { count_swap = 0; count_comparison = 0; int d[NUM_DATA]; copy_array(data[i], d, NUM_DATA); // 配列のコピー printf("----------------\n"); print_array(d, NUM_DATA); // ソート前の配列の表示 selection_sort(d, NUM_DATA); // 挿入ソートの実行 print_array(d, NUM_DATA); // ソート後の配列の表示 printf("比較回数: %d\n", count_comparison); // 比較回数の表示 printf("交換回数: %d\n", count_swap); // 交換回数の表示 } } 上の雛形を使って選択ソートを実行するという問題なのですが途中までそれっぽいのは出来たのですが上手くいかないので解答をお願いします。 下に自分が今書いているものを置いておきます。 #include <stdbool.h> #include <stdio.h> #define NUM_ARRAY 4 #define NUM_DATA 5 int count_swap = 0; int count_comparison = 0; void swap(int d[], int i, int j) { count_swap += 1; printf("swap a[%d] = %d, a[%d] = %d\n", i, d[i], j, d[j]); int temp = d[i]; d[i] = d[j]; d[j] = temp; } void copy_array(int *a, int *b, int n) { for (int i = 0; i < n; i++) { b[i] = a[i]; } } void print_array(int d[], int n) { for (int i = 0; i < n; i++) { printf("%d ", d[i]); } printf("\n"); } bool compare(int d[], int i, int j) { count_comparison += 1; printf("compare a[%d] = %d, a[%d] = %d\n", i, d[i], j, d[j]); if (d[i] > d[j]) { return true; } else { return false; } } void selection_sort(int d[], int n) { int min; for (int i = 0; i < n - 1; i++) { min = i; for (int j = i + 1; j < i; j++) { if (compare(d, min, j)) { min = j; } } swap(d, i, min); print_array(d, n); } } int main(void) { int data[NUM_ARRAY][NUM_DATA] = { {9, 7, 5, 6, 8}, {9, 8, 7, 6, 5}, {5, 6, 7, 8, 9}, {5, 6, 8, 7, 9}}; for (int i = 0; i < NUM_ARRAY; i++) { count_swap = 0; count_comparison = 0; int d[NUM_DATA]; copy_array(data[i], d, NUM_DATA); // 配列のコピー printf("----------------\n"); print_array(d, NUM_DATA); // ソート前の配列の表⽰ selection_sort(d, NUM_DATA); // 挿⼊ソートの実⾏ print_array(d, NUM_DATA); // ソート後の配列の表⽰ printf("⽐較回数: %d\n", count_comparison); // ⽐較回数の表⽰ printf("交換回数: %d\n", count_swap); // 交換回数の表⽰ } }

  • C++ ソートのやり方

    僕が作ったプログラムで、これはバブルソートなのかわからないので教えてください。 また、ほかのソートの仕方も教えてください。 よろしくお願いします。 汎用関数を使っているのでわかりにくいかもしれないですがお願いします。 #include <iostream> using namespace std; template <class X>void Sort(X *data, int size) { X temp; for (int i = 0; i < size; i++){ for (int j = i + 1; j < size; j++){ if (data[i]>data[j]){ temp = data[i]; data[i] = data[j]; data[j] = temp; } } } } int main() { int i[10]{1, 4, 3, 5, 2, 10, 2, 7, 6, 8}; char c[10]{'c', 'b', 'z', 'a', 'x', 'y', 'j', 'n', 'm', 'r'}; Sort(c, 10); Sort(i, 10); for (int j = 0; j < 10; j++){ cout << i[j] << ' '; } cout << endl; for (int j = 0; j < 10; j++){ cout << c[j] << ' '; } cout << endl; getchar(); return 0; }

専門家に質問してみよう