This is a program that using merge sort – sorts a list of 1000 numbers from 1 – 1000.
It displays the original list, then calls a recursive method to sort it, then displays it.
What I do not understand within the code are these two lines:
MergeSort (numbers, low, middle); // within method it will say "HERE"
MergeSort (numbers, middle + 1, high);
I am a beginner in java and this goes against everything I learned as I cant comprehend how you can call a method within a method. Unless its a object whcih I doubt. Could someone explain me what these two lines of code do?
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]);
}
}
}
Of course a method may invoke another method. The only confusing part here is that this method is static, which means it is invoked on a class instead of an object. Since it is called inside of the class it is defined in, you do not need to write
MergeSortExample.MergeSort(). If you want to understand the differences between static and instance methods and fields, I suggest you look at the tutorials on the Java website.