こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

昇順と降順

C言語でクイックソートを行うプログラムを探していたところ、希望していたものが見つかりました。

このプログラムは与えられた数列を昇順に並び替えるものなのですが、これを降順に並び替えるにはどうしたらよいでしょうか?
いろいろ試してみたのですが、無限ループになってしまいます。

#include <stdio.h>

void QSort(int x[ ], int left, int right);
void Swap(int x[ ], int i, int j);
void ShowData(int x[ ], int n);
void main(void);

/* クイックソートを行う */
void QSort(int x[ ], int left, int right)
{
int i, j;
int pivot;

i = left; /* ソートする配列の一番小さい要素の添字 */
j = right; /* ソートする配列の一番大きい要素の添字 */

pivot = x[(left + right) / 2]; /* 基準値を配列の中央付近にとる */

while (1) { /* 無限ループ */

while (x[i] < pivot) /* pivot より大きい値が */
i++; /* 出るまで i を増加させる */

while (pivot < x[j]) /* pivot より小さい値が */
j--; /* 出るまで j を減少させる */
if (i >= j) /* i >= j なら */
break; /* 無限ループから抜ける */

Swap(x, i, j); /* x[i] と x[j]を交換 */
i++; /* 次のデータ */
j--;
}
ShowData(x, 10); /* 途中経過を表示 */

if (left < i - 1) /* 基準値の左に 2 以上要素があれば */
QSort(x, left, i - 1); /* 左の配列を Q ソートする */
if (j + 1 < right) /* 基準値の右に 2 以上要素があれば */
QSort(x, j + 1, right); /* 右の配列を Q ソートする */
}

/* 配列の要素を交換する */
void Swap(int x[ ], int i, int j)
{
int temp;

temp = x[i];
x[i] = x[j];
x[j] = temp;
}


/* n 個のデータを表示する */
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);
}

投稿日時 - 2008-12-15 12:40:25

QNo.4557292

困ってます

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.3

大小の判断を逆にするだけです。

投稿日時 - 2008-12-15 17:56:54

ANo.2

昇順にソートしてから逆順にする.

投稿日時 - 2008-12-15 13:39:31

ANo.1

>これを降順に並び替えるにはどうしたらよいでしょうか?

問題、課題の丸投げは禁止。

回答者に、何らかの作業を依頼する行為(例えば「これを降順に並び替えるプログラムに書き替えて下さい」など)も禁止。

クイックソートの原理を解説したサイトが腐るほどあるので、まず、クイックソートの原理を理解すること。

クイックソートの原理が理解できれば、昇順と降順の変更は超簡単。

投稿日時 - 2008-12-15 12:53:56

あなたにオススメの質問