• 締切済み

ヒープソート

ヒープへのデータの格納と取り出しを適当な例(データ数が7個)を用いておしえていただけないでしょうか?よろしくおねがいします。

  • Java
  • 回答数2
  • ありがとう数0

みんなの回答

  • ssr-y6
  • ベストアンサー率71% (5/7)
回答No.2

 ヒープソート(二分木ソート)は、まず二分木を親よりも子供のほうが必ず大きいか等しくなるように作っていく。 作り終わったら、一番下の親から順に木の構造を維持しつつ取り出していくことでソートする方法。  以下が、そのサンプルです。 public class heapsort { public static void main(String args[]) { int i, j, k, d[], h[] = {5, 10, 1, 3, 8, 9, 2, 7, 4, 6}; int Parent, Child; try { String s[] = args[0].split(","); d = new int[s.length]; for (i = 0; i < s.length; i ++) d[i] = Integer.parseInt(s[i]); } catch (Exception e) { d = new int[h.length]; for (i = 0; i < d.length; i ++) d[i] = h[i]; }; h = new int[d.length]; for (i = 0; i < d.length; i ++) { h[i] = d[i]; Child = i; Parent = (Child - 1) / 2; while ((Child > 0) && ((h[Child] < h[Parent]))) { j = h[Child]; h[Child] = h[Parent]; h[Parent] = j; Child = Parent; Parent = (Child - 1) / 2; }; }; for (i = 0, k = d.length - 1; i < d.length; i ++, k --) { d[i] = h[0]; h[0] = h[k]; Parent = 0; Child = (Parent + 1) * 2; while (Child <= k) { if ((Child == k) || (h[Child] > h[Child - 1])) Child --; if (h[Parent] > h[Child]) { j = h[Child]; h[Child] = h[Parent]; h[Parent] = j; }; Parent = Child; Child = (Parent + 1) * 2; }; }; for (i = 0; i < d.length; i ++) System.out.println(d[i]); }; }

  • fortranxp
  • ベストアンサー率26% (181/684)
回答No.1

ヒープソートとは別名 二分木ソートとも言われ ております。

参考URL:
http://lecture.ecc.u-tokyo.ac.jp/~cichiji/cp-01/cp-01-10-4.html

関連するQ&A

  • ヒープソート 追加操作について

    配列を用いたヒープにデータを追加する。 この際、データの追加は配列の最後の要素に新たなデータを加え、ヒープ条件を満足するまで 親子間でデータの交換を行う。 要素数をnとしたら、この追加操作にかかる最悪時間計算量を求めよ。 この問題なのですが、ただ単にデータを一つ追加する際の最悪時間計算量だったら、 オーダlog n ですが、 追加する要素がnこだったら、n* log nになります。 この問題ではどちらがより適切なのでしょうか? どなたかご教授ください。

  • ヒープソートの問題について

    分からない問題があります。 どなたかお教え下さい。よろしくお願いします。 Max-Heapify (A,i) 1. L <- 2i 2. R <- 2i+1 3. if L<= heap-size[A] かつ A[L] > A[i] 4. then largest <- L 5. else largest <- i 6. if R<= heap-size[A] かつA[R] > A[largest]) 7. then largest <-R 8. if largest !=i 9. then 値の交換A[i] <-> A[largest] 10. Max-Heapify (A,largest) Build-Max-Heap (A) 1. heap-size[A] <- length[A] 2. for i<- ⌊length[A] /2⌋ downto 1 3 do Max-Heapify (A,i) Heap-Sort (A) 1. Build-Max-Heap (A) 2. for i<- length[A] downto 2 3 do 値の交換 A[1]<->A[i] 4 heap-size[A] = heap-size [A] – 1 5 Build-Max-Heap (A) 上に示す疑似コードを参考に、以下の問いに答えなさい。ただし、length[A]、heap-size[A]は配列Aの要素数、配列Aに格納されているヒープの要素をそれぞれ示す。 a. ヒープに格納される要素数をnとし、要素の添字の範囲を求めなさい。 b. 配列A=<3,9,8,15,4,2,5,1,7,10>からBuild-Max-Heapによりmax-ヒープを生成したときの結果を示しなさい。 c. 上のHeapsortは、配列を正しくソートするか?しないなら、正しくソートするようにするにはどのように修正すればよいか?理由と共に答えなさい。 d. マージソートと比較してヒープソートの良い点を述べなさい。

  • 【ヒープの作り方】

    データ構造やアルゴリズムについての質問です。 「ヒープ」を用いてソートができたりすること、 ヒープへ挿入や、ヒープからの削除は分かるのですが、 そもそもヒープの作り方が分かりません。 ≪作り方≫ ある要素の集合が与えられたとき、 1つ目の値をルートにもってくる 2つ目の値をルートと比較し、子≦ルートとなるように追加 3つ目の値をルートと比較し、子≦ルートとなるように追加 4つ目の値をルートの左の子と比較し、子≦ルートの左の子、かつルートとも比較 ..... という風に要素の集合から要素がなくなるまで続けるので正しいでしょうか? それとも初めに与えられた要素の集合を ひとまず要素数分の2分木構造に割り当て、 ヒープが成り立つように、あとから値の交換を 行うのでしょうか? いま、要素の集団は配列のように順番が決まっているとして 考えています。 ≪取り出しと削除≫ 値の「取り出し」と「削除」は別物。という認識は正しいでしょうか? (1)取り出し...末端の最も右の葉をルートにコピーし、ヒープを再構成。 ⇒ルートの値を取り出す。 (2)削除...削除したい値を削除し、その子孫を繰り上げる。 詳しい方がおられましたら、ご指摘、アドバイス等 どうぞよろしくお願い致します。

  • 配列等へのアクセスについて

    プログラム初級者です。 普通配列などへデータを格納するときはインデックスを使って、取り出す時もインデックスを使うと思いますが、一意の文字列をキーとしてデータの格納、取り出しをするような方法はないでしょうか?

    • ベストアンサー
    • Java
  • C#で、ファイルのデータを取得し、配列に格納

    C#を始めたばかりで分からないことも多いため、質問させていただきます。 C#で、テキストファイルにある2進数の数値 例: 00111100 11111100 00010100 のような8桁のデータをC#でテキストファイルから2進数のまま読み取り、 配列に格納したいです。 上の例で考えると、 byte[0]に 00111100 byte[1]に 11111100 byte[2]に 00010100  のデータが入力されているような感じです。 ArrayListを使用する方法や、 バイナリファイルで読み込む方法などもあると思うのですが、 データを1行ごとに配列に入力し、 それを見た目どおり2進数として格納する方法が分かりません。 やはり、文字コードなどを参考に、 1文字ずつ格納し、引き算していくしか方法はないのでしょうか? 文章が分かりにくくて申し訳ないのですが、回答いただけるとありがたいです! よろしくお願いいたします。

  • エクセル2003 string型のデーターの所定文字数の数の取得

    いつもアドバイス頂きありがとうございます。 今回、質問させていただきたいのは、 string型でデーターを取得した文字列に対して ある文字の文字数がいくつ在るかを取得したいのですが VBA関数で、そのような関数はあるのでしょうか? 例  myDataにstring型の文字列を取得してあります。 その中に「,」(カンマ)が何個存在するかと言う事 を取得したい。 やりたい事として、mydata()の中に2次元配列要素となるデーターを 1次元で仮格納してあり、それをセルに書き出すために2次元 に格納(splitで再格納)しなおしているのですが、データーが変わる たびに、カンマの数を数えて配列宣言を記入するのが面倒なので、 カンマの数がいくつでも、2次元に再格納できるようにしたいためで す。 宜しくお願いいたします。

  • アルゴリズムでわからない問題があります。(C言語)

    問題1:探索アルゴリズムであるハッシュ法について正しいものを選べ。 (1)ハッシュ関数の出力によりデータを格納した配列の先頭から順番に調べる. (2) 入力データを,ハッシュ関数の出力により求めた格納場所に基づいて,あらかじめ木構造に格納しておく. (4) 入力データを格納した配列を繰り返し2つに分割し,それぞれを順番に調べていく. (3) 入力データから格納場所の位置に変換する関数(ハッシュ関数)の出力により,データの探索場所を決定する。 (5) 入力データを,ハッシュ関数の出力により求めた格納場所に基づいて,あらかじめヒープに格納しておく 問題2:探索アルゴリズムであるハッシュ法について正しくないものを選べ。 (1)入力データはハッシュ値で決められる場所に格納される. (2) ハッシュ関数には,異なる入力の値に対し異なる値を出力することが求められる. (3) ハッシュ関数の時間計算量は,入力データのサイズに比例する. (4) データの格納場所が大きい方が効率がよい. (5) 一般に2分探索法より高速に動作する. どなたかアルゴリズムに詳しい方回答お願いします

  • 整数の選択

    アルゴリズムに関する質問です. n個の相異なる整数が配列 A[1..n] に格納されていて,その配列の中からk番目に小さい整数を選ぶ問題のアルゴリズムを考えています.kは 1<=k<=n を満たす自然数であり,この選択問題は O(n) で解けるものです. ヒープを使ったりして考えたのですがうまくいきません.どなたかこのアルゴリズムを教えてください.よろしくお願いします.

  • 【C#】テキストファイルを2進数で取得&配列に格納

    http://okwave.jp/qa/q7812279.html 前回の質問が分かりにくかったため、もっと詳しく書いていこうと思います。 テキストファイルを1行ずつ読み取り、それをbyte型に保存したいです。 例:test.txt 01001000 01110000 01010100 11100110 01010101 ↑のような8桁の2進数がテキストファイルに記入されています。 そのテキストファイルを読み取り、 byte配列に格納したいです。 例: byte[0]に01001000 byte[1]に01110000 byte[2]に01010100 byte[3]に11100110 上記のようにデータが格納されるよう、 ファイルを読み取り、配列に入れたいと思っています。 C#初心者のため、右も左も分からないのですが、 とりあえず、やろうとしている流れを以下に書きます。 (1)ファイルを読み込む (2)ArrayListに格納 (3)データ変換(文字列を2進数に) (4)データの出力(byte型) ArrayListでなくても構わないのですが、 他にいい方法が思いつかなかったので…。 言いたいことがぐちゃぐちゃになってきたのでまとめると、 byte[0]にファイルから読み取った1行のデータ(01001011等)を byte型で入力したい。 ということです。 分からなければ、コメントお願い致します。 文章が雑で分かりにくいかもしれませんが、回答頂けると嬉しいです。

  • i phoneの写真データーについて

    i phoneの写真データーについて困っておりまして投稿させて頂きます。パソコンのハードディスクが壊れてしまったようで、格納してあった写真データーだけでも救出と思い、家電量販店にデーター抽出を依頼しましたが、思いのほかダメージが大きいようで、取り出しには数万円掛かり、かつ取り出しも100%保証出来るものではないということでした。しかしi phone5で同期化させている為、iphoneで閲覧は出来、かつ写真屋に持って行けば現像も可能かと思いますが、ハードディスクに入っていたようなデーターの状態にiphoneから抽出、DVD等のメディアに保存することなど可能なのでしょうか。 お詳しい方がいらっしゃいましたら是非ともご教授頂きたくよろしくお願いします。