• ベストアンサー

100万個の整数のソート

2491 482 112 .. 1044 のように、100万個の整数をテキストファイルから読み込んで、ソートするプログラムを作ることになりました。 これをjavaでやるのは現実的でしょうか? (1日で終わる?) java だと Arrays.sort というメソッドがあるとまでは聞いたのですが、個数が多くてもプログラムがちゃんと動くのか不安です。

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

  • ベストアンサー
  • kakusuke
  • ベストアンサー率36% (95/259)
回答No.3

ファイルのソートの方法はとりあえず2種類あると思います。 1.ファイルから1件(行?)ずつ読み込みながら、別ファイルに書き込んでいくやり方 ・データ件数が多いときにメモリの圧迫を防ぐ。 ・HDDフル稼働になる。 ※NECソフトのソートマージツール(¥50万)では、 100バイト×1000万行=130秒で処理可能。 2.すべてメモリに読み込み、   メモリ内でソートするやり方 ・データ件数が多いときにメモリが圧迫される。 ・メモリ上で操作するので速い。 ※クイックソートと同等のスピードでメモリの肥大化を防ぐ、 コムソート(combsort)というソートのやり方があります。 整数値の平均が6バイトとして、 6バイト×100万件=6Mバイト まぁ大丈夫でしょう…。 ちなみにコムソートのロジックはこんな感じです。   public void ComSort(long[] data) {     double sf = 1.3;     long gap = data.length;     boolean flag = true;     int j = 0;     while (flag || (gap > 1)) {       gap = (long) Math.floor(gap / sf);       if (gap == 9 || gap == 10) gap = 11;       if (gap < 1)         gap = 1;       flag = true;       for (int i = 0; i < data.length - gap; i++) {         j = i + gap;         if (data[i] > data[j]) {           long buf;           buf = data[i];           data[i] = data[j];           data[j] = buf;           flag = false;         }       }     }   }

white-tiger
質問者

お礼

ありがとうございました!

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

その他の回答 (2)

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.2

ソート対象の数が多いときにどうなのかという質問だとして、 http://sdc.sun.co.jp/java/docs/j2se/1.4/ja/docs/ja/api/java/util/Arrays.html#sort(int[]) public static void sort(int[] a) 指定された int 値の配列を数値の昇順でソートします。ソートアルゴリズムは調整されたクイックソートで、『Software-Practice and Experience, Vol. 23(11)』(1993 年 11 月) の 1249 ~ 1265 ページの Jon L. Bentley と M. Douglas McIlroy による「Engineering a Sort Function」という記事から応用したものです。このアルゴリズムは、他のクイックソートアルゴリズムでは n の二乗のパフォーマンスに低下させる多くのデータセットにおいて、n*log(n) のパフォーマンスを提供します。 ということなので、アルゴリズム的な問題はないと思います。 とりあえず乱数で百万個の整数を生成してそれをソートするという プログラムを組んで試してみましたが >java SortArray start :Sun Sep 30 01:28:29 JST 2007 finish :Sun Sep 30 01:28:32 JST 2007 >java SortArray start :Sun Sep 30 01:32:31 JST 2007 finish :Sun Sep 30 01:32:31 JST 2007 >java SortArray start :Sun Sep 30 01:32:33 JST 2007 finish :Sun Sep 30 01:32:33 JST 2007 >java SortArray start :Sun Sep 30 01:32:42 JST 2007 finish :Sun Sep 30 01:32:43 JST 2007 >java SortArray start :Sun Sep 30 01:32:48 JST 2007 finish :Sun Sep 30 01:32:48 JST 2007 それなりのマシンで動かすならそんなに心配する必要はないのでは? ファイルの読み込みをするとそれで時間がかかることは明らかですが、 ざっと一行あたり10バイトとしてそれが百万行で一千万バイト。 ほぼ10メガバイトとみても一日仕事にはならないでしょう。

white-tiger
質問者

お礼

ありがとうございました!

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

現実的とはどういう意味なのかが良くわかりませんが、 javaでそのようなプログラムを作ることは可能ですし、 経験者であればさほど時間も掛からないと思います。 未経験であっても、それなりにjavaを学習していれば問題ないレベルだと思います。 また、java以外でと考えているのであればCのほうがより機械語に近いので処理速度的には早いでしょう。 ただしCの場合は領域の確保をよりシビアにしないといけないかもしれません。 領域の確保を気にしないのであればC++のほうがクラスを使って楽に作れそうな気もします。

white-tiger
質問者

お礼

ありがとうございました!

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

関連するQ&A

  • 文字列を整数に型変換してソート

    コマンドライン入力で文字列を入力してそれを整数型に変換。そして、それをソートするプログラムを作ってるんですが、なぜかうまくいかず、出力される数字がすべて0になります。 どなたかヘルプおねがいします>< class sort32 { public static void main(String[] args) { System.out.println("------------------------"); int i=0; int j=i+1; int vals[]; vals = new int[args.length]; for(i=0;i>args.length ;i++) { vals[i] = Integer.parseInt(args[i]); } java.util.Arrays.sort(vals); for(int k=0; k<vals.length; k++) System.out.println("<"+vals[k]+">"); } }

  • java ソート

    java ソート ソートプログラムを作ってみましょう ? double型の配列とメソッドを持つクラスを定義 ? コンストラクタで配列を初期化(0.0で初期化) ?配列を昇順,降順に並び替えるメソッドを持つこと ? 2種類のメソッドを持っても良い ? 引数の値で変えても良い ? ソート済み配列をチェックするメソッドを持つこと ? 1000000要素程度のソーティングで時間計測 課題です 全く手が出せず困ってます・・・。 ヒント、手順、解答 なんでも良いので、救いの手をお願いします!!

  • 10個の整数を入力して小さい順にソートする

    C言語を使って、10個の整数を読み込んで小さい順にソートするプログラムを作っています。 #include<stdio.h> #include<stdlib.h> int main() { int a[9] = {1, 2, 3, 4, 5, 6, 7, 8, 9}; int i; for (i = 0; i < 9; ++i ) { printf("No. %d Please Enter!", a[i]); scanf("%d", &a[i]); } return(0); } これで、10個の整数を読み込んだ後、ソートする方法が分かりません。 どなたか教えていただけますでしょうか^^;

  • javaのソートについて。

    うまく文章で伝えられないかもしれませんがお願いします。 csvファイルの中に 名前、住所、電話番号、アドレス と入った一文が複数あるとします。 これを名前の50音順に並べたいのですが、 文字でもArrays.sortでソートは可能でしょうか? 一応やってみたのですがうまくいきませんでした。 さらに質問なんですが私はこのcsvファイルの一文を削除したり、変更したりというプログラムを作っています。 変更や削除の場合は一度配列に全ての文を入れてその後削除、変更を行った後に またファイルに書き込むという形をとっています。 この場合50音順に並べるには一度書き込みが終った後もう一度読み込んでソートをして 書き込みなおすしか方法はないのでしょうか? ご教授お願いします。

    • ベストアンサー
    • Java
  • ソートのプログラム

    100個の整数をファイル「int.txt」から出力して小さい順にソートして「out.txt」に書き込むC言語のプログラムなんですけど、自分で何回やってもできないのでどうか教えてください。

  • ソート Comparator

    Integer型の変数num(10,4,8,6,9,5)をそれぞれ含むオブジェクト配列aryがあり、それをソートするため Arrays.sort(arry,sortLogic); とした場合、 Comparatorインターフェースを実装したクラスsortLogic内のメソッドで public int compare(Object object1, Object object2) {   return ((ary)object1).compareTo(((ary)object2).num); } とすると、昇順にソート(修正ソートマージ)、また、 return ((ary)object1).compareTo(((ary)object2).num); とすると降順にソートされるみたいなのですが、どのような手順(アルゴリズム)でソートされるのでしょうか?

    • ベストアンサー
    • Java
  • Javaでキーボードから入力された文字列をソートするプログラムについて。

    Java初心者です。今回、タイトル通りのプログラムを作成する事になったのですが、 import java.io.*; import java.util.*; public class dicsort { public static void main(String args[]) throws NumberFormatException, IOException{ String[] diclist = new String[4]; BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); for(int i=1; i<diclist.length; i++){ System.out.print("ソートしたい単語を入力して下さい。"+i+"語目"); diclist[i] = in.readLine(); } Arrays.sort(diclist); System.out.println("答えは"); for(int n=1; n<diclist.length; n++){ System.out.println(diclist[n]); } System.out.println("である。"); } } というプログラムを実行したところ、 ソートしたい単語を入力して下さい。1語目あさ ソートしたい単語を入力して下さい。2語目さか ソートしたい単語を入力して下さい。3語目かさ Exception in thread "main" java.lang.NullPointerException at java.util.Arrays.mergeSort(Unknown Source) at java.util.Arrays.sort(Unknown Source) at dicsort.main(dicsort.java:11) というエラーが発生してしまいました。 ソートの部分で問題が起きているらしいのですが、自分では考えが凝り固まってしまい間違いが発見出来ません。 どなたか原因を教えて頂けないでしょうか、よろしくお願いします。

  • VBA ファイルを読み込む際のSortメソッドの使い方

    tabで区切られたテキストファイルを読み込み、日時の列を昇順で並び替える処理をしようとしました。 sortメソッドを使って並び変えようとしましたが、上手くいきません。。 既に開いているエクセル上では簡単なsortメソッドを使って並び替えはできました。↓のようなマクロ記録を使って。 Range("A1:A11").Select Range("A1:C11").Sort Key1:=Range("A1"), Order1:=xlAscending, Header:= xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, SortMethod:=xlPinYin,DataOption1:=xlSortNormal ファイルを読み込んで、sortメソッドを使うには何か特別な方法があるのでしょうか?どなたか教えて下さい。よろしくお願いします。

  • Javaで配列のソートを行ったとき、その要素を得る

    こんにちは Javaで、 int[] arr=new int[]{3,1,5,4,6,2}; Arrays.sort(arr); で、一発で、大きさ順になるようですが、 このとき、大きさの番号順を得た得たいのですが int[] arr2=new int [7]; でarr2[1]=2;arr2[2]=6;arr2[3]=1;////という結果が得たいのですがそうするのでしょうか?

  • (初心者) C#で1行ずつ表示し、整数にしたいです

    C#を初めて1カ月程度の初心者です。 テキストファイルを一行ずつ読みこんで、読みこんだ文章をint型の整数にしたいです。 それをクラスにおきたいのですが、どう書けばよいでしょうか。 また、int型の整数になったものは別のクラスのメソッドで参照する予定です。 よろしくお願いします。