0

これは、マージソートを使用するプログラムです - 1000 個の数字のリストを 1 から 1000 までソートします。元のリストを表示し、再帰メソッドを呼び出してソートし、表示します。

コード内で理解できないのは、次の 2 行です。

MergeSort (数値、低、中); // メソッド内では "HERE" と表示されます

MergeSort (数値、中間 + 1、上位);

私はJavaの初心者ですが、メソッド内でメソッドを呼び出す方法を理解できないため、これは私が学んだすべてに反します。私が疑わしいオブジェクトでない限り。この 2 行のコードが何をするのか説明してもらえますか?

import java.io.*;
import java.util.*;
import java.text.*;

public class MergeSortExample
{
    static final int Max = 1000;

    static void MergeSort (int[] numbers, int lo, int n) // recursive method
    {

        int low = lo; // 0
        int high = n; // 999

        if (low >= high) // return case;
        {
            return;
        }

        int middle = (low + high) / 2;
        MergeSort (numbers, low, middle); // HERE
        MergeSort (numbers, middle + 1, high); // HERE

        int end_low = middle;
        int start_high = middle + 1;

        while ((lo <= end_low) && (start_high <= high))
        {
            if (numbers [low] < numbers [start_high])
            {
                low++;
            }
            else
            {
                int Temp = numbers [start_high];

                for (int k = start_high - 1 ; k >= low ; k--)
                {
                    numbers [k + 1] = numbers [k];
                }
                numbers [low] = Temp;
                low++;
                end_low++;
                start_high++;
            }
        }




    }


    public static void main (String str[]) throws IOException
    {
        BufferedReader stdin = new BufferedReader (new InputStreamReader (System.in));
        DecimalFormat df = new DecimalFormat ("#");
        BufferedReader reader = new BufferedReader (new FileReader ("unsorted.txt"));
        //BufferedWriter writer = new BufferedWriter (new FileWriter ("test.txt", true)); // text to write


        int[] numbers = new int [Max];  // if its int the 0's in the beginiing would be cut off
        String line = null;
        int[] count = {0};

        int low = 0;
        int high = count [0] - 1;


        while ((line = reader.readLine ()) != null)
        {
            numbers [count [0]] = Integer.parseInt (line);
            System.out.println (numbers [count [0]]);

            count [0]++;
        }
        reader.close ();
        System.out.println ();
        System.out.println ("There are " + count [0] + " numbers.");
        System.out.println ();


        ///////////////////////////////////////////////////////////////////////////////


        MergeSort (numbers, 0, count [0] - 1);

        for (int i = 0 ; i < count [0] ; i++)
        {
            System.out.println (numbers [i]);
        }




    }
}
4

3 に答える 3

1

基本的な再帰です。マージ ソートは、リストを 2 つの部分に分割し、それぞれをマージ ソートしてから、2 つのリストをマージすることによって機能します。あなたが求めている部分は、マージが2つの部分のそれぞれをソートする部分です。

于 2013-01-08T02:33:46.657 に答える
1

静的メソッドの再帰呼び出しですMergeSort()。ここでは悪い規則が使用されています。メソッドの名前は小文字で始める必要があります

于 2013-01-08T02:33:51.847 に答える
0

もちろん、メソッドは別のメソッドを呼び出すことができます。ここで唯一紛らわしいのは、このメソッドがstaticであることです。つまり、オブジェクトではなくクラスで呼び出されるということです。定義されているクラス内で呼び出されるため、記述する必要はありません。静的メソッドとインスタンス メソッドおよびフィールドの違いを理解したい場合は、Java Web サイトのチュートリアルを参照することをお勧めします。MergeSortExample.MergeSort()

于 2013-01-08T02:31:46.733 に答える