• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:アルゴリズムの問題です)

アルゴリズムの問題:データの降順ソート方法

このQ&Aのポイント
  • データの昇順(小→大)にソートする基本選択法のフローチャートがあるが、整数の一次元配列に格納されたデータ(100個)を降順(大→小)にソートするフローチャートの変化箇所を教えてください。
  • 整数の一次元配列に格納されたデータ(100個)を降順(大→小)にソートするためのフローチャートの変更箇所を教えてください。
  • 基本選択法でデータを昇順(小→大)にソートするフローチャートがあるが、整数一次元配列に格納されたデータ(100個)を降順(大→小)にソートするためのフローチャートに変更を加える場合、どこを変化させれば良いですか?

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

  • ベストアンサー
  • Toshi0230
  • ベストアンサー率51% (836/1635)
回答No.1

一度、上記のアルゴリズムでどのように並び替えを行っているか、実際に手でやってみましょう。100個の並び替えは大変ですから、10個程度に数を減らしてやってみてください。 そうすればどこで並び替えを行っているかわかるでしょうし、それがわかれば答えもわかると思いますよ。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • クイックソートのアルゴリズム

    http://www1.cts.ne.jp/~clab/hsample/Sort/Sort9.html こちらにあったソースを改造しました。 #include <stdio.h> void QSort(int x[ ], int left, int right) {   int i, j, temp;   int pivot;   i = left;   j = right;   pivot = x[(left + right) / 2]; // 6,5,4,3 // pivot=4   while (1) {   while (x[i] <= pivot) i++; // サイトのソースは = が無かったから付けた // 2回目のループでは j=2   while (pivot < x[j]) j--; // 2回目のループで x[-1] を参照しませんか? // 初回ループで i=0, j=3   if (i >= j) break;   temp = x[i]; x[i] = x[j]; x[j] = temp; // 交換   i++; j--;   }   ShowData(x, 10); // 途中経過を表示   if (left < i - 1) QSort(x, left, i - 1);   if (j + 1 < right) QSort(x, j + 1, right); } void ShowData(int x[ ], int n) {   int i;   for (i = 0; i < n ; i++) printf("%d ", x[i]);   printf("\n"); } void main(void) {   int x[] = {6, 3, 1, 7, 0, 4, 8, 5, 2, 9};   int n = 10;   printf("ソート前:\n");   ShowData(x, n);   printf("ソート中:\n");   QSort(x, 0, n - 1);   printf("ソート後:\n");   ShowData(x, n); } テストデータが 6,5,4,3 だと、 2回目のループで x[-1] を参照しませんか? 今コンパイラが使えません。 教えてください。 それと、=を付けたんですが、付けないといけませんよね?

  • 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文の続く限り繰り返すように書いたはずです。 まだ勉強し始めた私にはどこが間違っているのか分からないので 分かる方はご指摘をお願いします。

  • 次の問題がよくわかりません。

    (1)下記のステートメントを実行したときのjの値を求めなさい。 m=1;n=0;j=5; if(m>0 && n<0) j=j*j+1; else j=j*5; (2)下記のプログラムが終了した時点でのjの値を示しなさい。 リストの初期値 L[1]L[2]L[3]L[4]L[5]L[6]L[7]L[8] 30 10 24 23 28 14 30 9 i=1; j=8; sv=22; while(i<=j) { while(L[i]<sv) i=i+1; while(L[j]>sv) j=j-1 if(i<=j) {temp=L[1]; L[i]=L[j]; L[j]=temp; i=i+1; j=j-1;} } (3)二分検索において、整列されたデータの個数が8倍になると、最大検索回数はどうなるか。 (4)下記のプログラムにおいて、最悪の事例の場合に実行される命令文の数をリスト(L)の要素の数(n)で示しなさい。 search(L[],n) { k=1; safe=100 while(k<=n) { if(safe<L[k]) safe=L[k]; k=k+1; } return safe; } 以上です。 解答と詳しい解説をよろしくお願いします。

  • このフローチャートがわかりません><

    あらかじめ値が格納されている配列t(要素数:10個)から、最大値を求めるフローチャートと最小値を求めるフローチャートをそれぞれ作成した。空欄を埋めなさい。 横書きですいません>< 開始-□-□-ループ□-◇-cnt+1→1-ループ-min出力-終了 というフローチャートです。 □◇が空欄で◇は判断記号です。 フローチャートをまっすぐ進むとイエス、曲がるとノーとなります。 解説できる方いましたらよろしくお願いします。

  • データ構造とアルゴリズムの問題です

    要素数がnである配列aの要素の最大値を求めるアルゴリズムのループ端によるフローチャートを完成せよ(前判定繰返し) max =a[0] i=1; while i<n do{ if(a[i]>max)max=a[i]; i++; } a[0] → max 1 → i 前判定繰返し □ | yes a[i]□max-----| |        □      NO i+1 → i 前判定繰返し □の中を埋めるんですが教えてください

  • クイックソート後の出力(pascal)

    20個の整数データをクイックソートして出力せよ、という課題が出ました。クイックソートまでは出来た(コンパイルできたのでおそらく)のですが、その順に出力する方法がわかりません。どなたかお教えください。 program sort(input,output); const n = 20; type index = 1..n; var A : array[1..n] of integer; i,x,a : integer; p,j,k : index; function PIVOT(i,j : index):integer; var k:index; begin k:=i+1; while (A[i]=A[k]) and (k<=j) do k:=k+1; if k>j then PIVOT:=0 else if A[i]>=A[k] then PIVOT:=i else PIVOT:=k end; procedure SWAP(var x,y:integer); var temp:integer; begin temp:=x; x:=y; y:=temp end; procedure PARTITION(i,j:index; a:integer; var k:index); var l,r:index; begin l:=i; r:=j; while A[l]<a do l:=l+1; while A[r]>=a do r:=r-1; while l<=r do begin SWAP(A[l],A[r]); l:=l+1; r:=r-1; while A[l]<a do l:=l+1; while A[r]>=a do r:=r-1; end; k:=l end; procedure QUICKSORT(i,j:index); var a:integer; p:index; k:index; begin p:=PIVOT(i,j); if p<>0 then begin a:=A[p]; PARTITION(i,j,a,k); QUICKSORT(i,k-1); QUICKSORT(k,j) end end; begin i:=0; i:=1+1; for i:= 1 to n do begin A[i]:=0; end; i:=0; i:=i+1; for i:= 1 to n do begin readln(x); A[i]:=x end; a:=PIVOT(p,j); PARTITION(p,j,A[a],k); QUICKSORT(p,j) end. QUICKSORT(p,j)とend. の間に出力方法を書き込みたいのです。

  • データ構造とアルゴリズムの問題です

    要素数がnである配列aの要素の合計を求めるアルゴリズムのループ端によるフローチャートを完成せよ(後判定繰返し) sum =a[0] i=1; do{sum=sum+a[i]; i++; }while i<n; a[0] → sum 1 → i 後判定繰返し | □→sum; i+1 → i | □ 後判定繰返し □の中を埋めるんですが教えてください

  • Visual 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\n",&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[i]=%d\n",a[i]); } printf("Max=%d\n",max); printf("Min=%d\n",min); } } これをVisual C++でデバックすると 『test.exeの0x0fcbe42e(msvcr100d.dll)にハンドルされていない例外が発生しました:0C0000005: 場所 0x00000000 に書き込み中のアクセス違反が発生しました。』 と表示されて実行できません。 今日インストールしたばかりなのでどこでエラーが起きているのかわかりません。 これはプログラミングとVisual C++のどっちが原因なのでしょうか? もしお分かりになるならば、具体的な解決方法や プログラムの訂正点などを教えていただきたいです。

  • アルゴリズム

    教えてください。 フローチャート作成 入力された10進の自然数xを2進数yに変換し出力するプログラムのフローチャートをサブルーチンも含めて全て書け。ただし、整数型の変数aから第iビット目(最初を下位ビットとして第0ビットとせよ)を取り出す整数型関数(メソッド)get_bit( a,i )を作成すること。 プログラム作成 上で設計したプログラムを作成する。 実行結果 上で作成したプログラムの実行し、その実行結果を示す。

  • C言語 ファイル出力について

    Excelでも使えるようにCSV形式に書き込みをしたいのですがどのようにすればよいのでしょうか #include <stdio.h> #define N 50 int main(void) { int i, a, n[N], min, temp; for(i=0; i<N; i++) { printf("%2d番目の値:", i+1); scanf("%d",&n[i]); } for(i=0; i<N; i++) { min = i; for(a = i + 1; a < N; a++) { if(n[min] > n[a]) min = a; } temp = n[min]; n[min] = n[i]; n[i] = temp; } printf("小さい順:\n"); for(a=0; a<N; a++){ printf("%2d番目\t%d\n", a+1, n[a]); } return 0; }

タッチパネルエラーの対処方法
このQ&Aのポイント
  • タッチパネルに接触しているものを取り除いて下さいとのエラーメッセージが表示されたが、実際には何も接触していない場合、以下の対処方法を試してください。
  • まず、タッチパネルに付着している汚れやほこりを清掃しましょう。柔らかい布や乾燥したティッシュなどで優しく拭き取ることで、接触の不良を改善することができます。
  • また、タッチパネルの設定やドライバの更新を行うことも効果的です。設定メニューやデバイスマネージャーを確認し、最新のドライバをインストールすることで問題が解決するかもしれません。
回答を見る