A 回答 (7件)
- 最新から表示
- 回答順に表示
No.7
- 回答日時:
int num[10] の整数に誘われて、ちょっとデータが重なる場合はご容赦願うとして、if を使わない度数ソートを紹介します。
/* Int type sorting program by Mac OSX
* file neme: ab.c
* compile: gcc ab.c
* execution: ./a.out
*/
#include <stdio.h>
#include <time.h>/* time() */
#include <stdlib.h>/* srand() */
#define MEMSIZ 10/* ご利用枠 */
#define MAX 100/* 0以上の最大の整数値 */
#define OUTPUT 3/* 取り出す個数 */
int main(void) {
int num[MEMSIZ];
int sort[MAX + 1];
int i, count;
/* 初期値設定 */
for(i=0; i<=MAX; i++)
sort[i] = -1;
srand(time(NULL));
for(i=0; i<MEMSIZ; i++)
num[i] = rand() % (MAX + 1);
/* 使用データの出力 */
printf("num[%d]: ", MEMSIZ);
for(i=0; i<MEMSIZ; i++)
printf("%d ", num[i]);
printf("\n");
/* 度数ソート(ただし、程々の正の整数値であること) */
for(i=0; i<MEMSIZ; i++)
sort[num[i]] = num[i];
/* 抽出結果の出力 */
printf("result : ");
i = MAX;
count = 0;
while(count<OUTPUT && --i>=0) {
if(sort[i] >= 0) {
printf("%d ", sort[i]);
count += 1;
}
}
printf("\n");
return 0;
}
No.6
- 回答日時:
バブルソートでも良いと思いますが、根本的だし。
あなたなりには、おおげさじゃないかという疑問が生じたのだと思います。確かにそうです。
子の場合は良いとして、例えば、特殊な場合で、スピードを要求するとか、数万個の配列から3つだけとかの場合は、幼稚なやりかたで良いんじゃないですか?
例えば、
int num[MAX_CNT];
int flag[MAX_CNT] = {0, }; /*ゼロに初期化*/
int maxes[3];
int max=-32675;
int i=0;
int flag_index=0;
for (j=0; j<3; j++)
{
for (i=0; i<MAX_CNT; i++)
{
if (flag[i]==0)
continue;
if (max < num[i])
{
max = num[i];
flag_index=i;
}
}
flag[flag_index]=1;
maxes[j] = max;
}
こんなものかもしれません。
もう少し本格的にというか綺麗にしたいのならば、フラグを使わず、キューを使ってやると良いでしょ。でも、スピードの観点からだと、上記の幼稚なコードが早いでしょうね。
No.5
- 回答日時:
> もう少し簡単にできるような気がするのです。
何をもって簡単というのかわかりませんが、
std::sort(a + 0, a + 10, std::greater<int>());
std::copy(a + 0, a + 3, std::ostream_iterator<int>(std::cout, "\n"));
のように2行で済むのでは?
(実際にはヘッダをインクルードしなければなりませんが...)
No.4
- 回答日時:
・バブルソートや選択ソートで、大きい3つが確定した段階でやめる
どちらの場合でも、ソートのプログラムの昇順/降順とアルゴリズムをよく確認する。
昇順で最大値から確定する
→num[7],num[8],num[9]が確定したら止める
降順で最大値から確定する
→num[0],num[1],num[2]が確定したら止める
最小値から確定する
→全部ソートしなければならない
問題点:配列 numの順番が入れ替わってしまう
→ 順番が関係ないなら問題なし。
残しておきたいのなら、int num1[10]とか作って、内容をコピーして、コピーの方を並び換える
・int num2[4]とかして長さ4の配列を準備
1) num2[0~3]にnum[0~3]をコピー→降順でソート→num2[0~2]が暫定トップ3.num2[3]は脱落
2) num2[3] = num[4]→降順でソート→num2[0~2]が暫定トップ3.num2[3]は脱落
3) num2[3] = num[5] (以下略)
4) num[9]まで同様にくりかえし、最後に残ったnum2[0~2]がトップ3
num2のソートには、num2の規模、状態などから挿入ソートが最適でしょう
・numの値に同じものは一つもない場合のみで使える方法
1)最大値max1を取り出す
2) num[i] < max1 となるnum[i]の中から最大値max2を取り出す
2) num[i] < max2 となるnum[i]の中から最大値max3を取り出す
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- Java javaでのプログラム(配列)について質問です. 2 2022/10/14 22:27
- Java Java 配列<選挙> 4 2023/07/31 15:07
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- C言語・C++・C# 至急教えてください! プログラミングの問題です! お願いします! 出力2と全く同じ出力をするように、 2 2022/06/22 23:10
- PHP 配列の値の更新方法について 1 2022/08/05 09:49
- C言語・C++・C# このプログラミングの問題を教えて欲しいです。 キーボードから整数kを入力し、kが配列aの中に何個存在 2 2022/12/19 22:50
- Java Javaの問題なのですが、「3文字以上の英数字文字列を入力し、文字列の中に文字(9)が出てくるまでの 1 2023/06/06 18:55
- C言語・C++・C# 至急教えてください!プログラミングの問題です。 割られる整数と割る整数を受け取って、商と余りを出力す 3 2022/07/05 10:23
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
配列の問題
-
System.IO.Directory.GetFiles...
-
C# DataGridView のヘッダーセ...
-
VB.NETでファイル名順にファイ...
-
C言語・要素除去
-
csvファイル内にてソートす...
-
VBA基本構文の作り方 2列の...
-
C++ 入力した3つのint型の整数...
-
プログラミングについて 配列を...
-
あるディレクトリ内のファイル...
-
高速検索アルゴリズムとデータ...
-
Excelですべての組合せ(重複組...
-
excel VBA リストビューの行...
-
数字文字列のソート方法
-
構造体配列のソート
-
自己参照型構造体とソート
-
listboxの並び替え
-
4番目以降の並べ替え
-
VB6でデータを昇順に並べ替える
-
DataGridViewの複数列を連動し...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
System.IO.Directory.GetFiles...
-
VB.NETでファイル名順にファイ...
-
C# DataGridView のヘッダーセ...
-
なぜ?counterintuitive
-
ファイル名「1.jpg ~10.jpg~...
-
Excelですべての組合せ(重複組...
-
C# DataTableの行をソートしてD...
-
n番目に大きい数を求めるアル...
-
リスト構造のソートで悩んでま...
-
C言語・要素除去
-
10個の整数を入力して小さい順...
-
VBA基本構文の作り方 2列の...
-
あるディレクトリ内のファイル...
-
excel VBA の条件をつけての列...
-
excel VBA リストビューの行...
-
数字文字列のソート方法
-
Excel VBAで並べ替えをしたい
-
VBScriptで重複レコードを削除...
-
vbでDataTableの抽出コピー
-
構造体配列のソート
おすすめ情報