简体   繁体   中英

Coreman MergeSort implementation in java is not producing correct output

I am trying to implement Coreman's MergeSort algorithm in Java. But it always gives me wrong output.

Before sorting : [86, 8, 60, 9, 49, 73, 37, 59, 98, 69]

After Sorting : [8, 8, 9, 37, 37, 49, 49, 59, 69, 69]

Following is my code:

public class MergeSort {
    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        MergeSort mergeSort = new MergeSort();
        int [] data = mergeSort.createRandomNumberArray();
        mergeSort.print("Before sorting", data);
        long startTime = System.currentTimeMillis();
        mergeSort.sort(data);
        long endTime = System.currentTimeMillis();
        mergeSort.print("After Sorting", data);
        mergeSort.time(startTime, endTime);

    }

    public void sort(int[] data) {
        if(data == null)
            throw new NullPointerException();
        if(data.length == 0 || data.length == 1) {
            System.out.println("Size is " + data.length);
            return;
        }

        int length = data.length;
        mergeSort(data, 0, length - 1);
    }

    /**
     * @param data
     * @param first
     * @param last
     */
    private void mergeSort(int[ ] data, int first, int last) {
        if(first < last) {
            int middle = (first + last) / 2;
            mergeSort(data, first, middle);
            mergeSort(data, middle + 1, last);
            merge(data, first, middle, last);
        }
    }

    private void merge(int[ ] data, int first, int middle, int end) {    
        int lSize = middle - first + 1;
        int rSize = end - middle;
        int [] left = new int[lSize + 1];
        left[lSize] = Integer.MAX_VALUE;
        int [] right = new int[rSize + 1];
        right[rSize] = Integer.MAX_VALUE;
        for(int i = 0; i < lSize; i++) {
            left[i] = data[first + i];
        }

        for(int j = 0; j < rSize; j++) {
            right[j] = data[middle + j + 1];
        }

        print("Left: ", left);
        print("Right: ", right);

        int lIndex = 0;
        int rIndex = 0;

        for(int k = first; k < end; k++) { 
            if(left[lIndex] <= right[rIndex]) {
                data[k] = left[lIndex];
                lIndex++;
            } else {
                data[k] = right[rIndex];
                rIndex++;
            }
        }
    }


    public void print(String message, int [] array) {
        System.out.println(message + " : " + Arrays.toString(array));
    }

    public int [] createRandomNumberArray() {
        int [] data = new int[] {86,8,60,9,49,73,37,59,98,69} ;
        /*int [] data = new int[SIZE];
        for(int i = 0; i < SIZE; i++) {
            data[i] = RANDOM.nextInt(RANGE);
        }*/
        return data;
    }

    public long time(long start, long end) {
        long time = end - start;
        System.out.println("Time taken in sorting ==> " + time);
        return time;
    }

}

I tried to print values and debug the code, but am not able to find out what is wrong here. Please suggest what can be wrong here.

   for(int k = first; k < **=**end; k++) { 
                if(left[lIndex] <= right[rIndex]) {
                    data[k] = left[lIndex];
                    lIndex++;
                } else {
                    data[k] = right[rIndex];
                    rIndex++;
                }
            }

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM