マージソートの実装
今日調べ物してきずいたんですが、
マージソートのjavaの実装例が少なすぎる。
ソートの中ではローカルかも知れんけど、
実装しようぜ(←ってか貴様がつくれってな)
ってなぁわけで作りました。
マージソートの基本概要とかはググッてくさださい。
多分むっちゃヒットします。
class Merge { public static void main(String[] args) { int[] elements = { 9, 4, 3, 1, 5, 6, 7, 2, 8 }; sort(elements); for (int i = 0; i < elements.length; i++) { System.out.print(elements[i]); } } /** * いきなりdivideよんだら変数名が矛盾するから作ったメソッド * @param elements */ public static void sort(int ...elements) { divide(elements); } /** * 配列を分割する * @param elements */ private static void divide(int ...elements) { //要素が2つないと分割しない if (elements.length > 1) { //配列中央から配列先頭までの配列を作成する int center = elements.length / 2; int[] left = new int[center]; for (int i = 0; i < center; i++) { left[i] = elements[i]; } //配列中央より配列後尾までの配列を作成する int hearf = elements.length - center; int[] right = new int[hearf]; for (int i = 0; i < hearf; i++) { right[i] = elements[center + i]; } /* 分割できなくなるまで再帰的に処理する */ divide(left); divide(right); compare(left, right, elements); } } /** * 配列を比較する * @param left * @param right * @param elements */ private static void compare(int[] left, int[] right, int[] elements) { int i = 0; int j = 0; while (i < left.length || j < right.length) { if (judge(i,j,left,right)) { elements[i + j] = left[i]; i++; } else { elements[i + j] = right[j]; j++; } } } /** * ジャッジ用メソッドなので特に深い意味はないんです。 * @param iCount * @param jCount * @param left * @param right * @return */ private static boolean judge(int iCount, int jCount, int[] left, int[] right) { return jCount >= right.length || (iCount < left.length && left[iCount] < right[jCount]); } }
あのぉ、変数に「a」とかたまにクラス名に「a」とかつける人いるけど、
撲滅しましょう。
damePGは撲滅運動に参加します。
まったく変数が何を意味しているのかわからくなるので・・・・。
結構ググッたソースコードとかに多いような気がしてならん
(↑とかいいながら僕がまったくできてないですけど・・・)
最近思うのは変数名のつけ方で、その人のコーディングレベルが
少し見えるような気がします。
先輩とかすごい上手やし、変数名メソッド名見ただけでどんな処理なのかすぐに分かる。
最高にかっこいいっす。
とかたまに愚痴ってみたりもしつつ、
結婚式(連れの)落ち着いたらアプリいっぱい作成します。