Mergesort in java

后端 未结 12 501
予麋鹿
予麋鹿 2020-12-03 06:09

I am new to Java and have tried to implement mergesort in Java. However, even after running the program several times, instead of the desired sorted output, I am getting the

相关标签:
12条回答
  • 2020-12-03 06:10

    The problem is that java is pass by value and not pass by reference... When you are assigning to array A in the merge method you are changing a copy of the reference to A and not the reference to A itself. Therefore you need to pass A into your merge method and make a structural change to A.

    0 讨论(0)
  • 2020-12-03 06:11
    public class MyMergeSort {
    
        private int[] array;
        private int[] tempMergArr;
        private int length;
    
        public static void main(String a[]){
    
            int[] inputArr = {45,23,11,89,77,98,4,28,65,43};
            MyMergeSort mms = new MyMergeSort();
            mms.sort(inputArr);
            for(int i:inputArr){
                System.out.print(i);
                System.out.print(" ");
            }
        }
    
        public void sort(int inputArr[]) {
            this.array = inputArr;
            this.length = inputArr.length;
            this.tempMergArr = new int[length];
            doMergeSort(0, length - 1);
        }
    
        private void doMergeSort(int lowerIndex, int higherIndex) {
    
            if (lowerIndex < higherIndex) {
                int middle = lowerIndex + (higherIndex - lowerIndex) / 2;
                // Below step sorts the left side of the array
                doMergeSort(lowerIndex, middle);
                // Below step sorts the right side of the array
                doMergeSort(middle + 1, higherIndex);
                // Now merge both sides
                mergeParts(lowerIndex, middle, higherIndex);
            }
        }
    
        private void mergeParts(int lowerIndex, int middle, int higherIndex) {
    
            for (int i = lowerIndex; i <= higherIndex; i++) {
                tempMergArr[i] = array[i];
            }
            int i = lowerIndex;
            int j = middle + 1;
            int k = lowerIndex;
            while (i <= middle && j <= higherIndex) {
                if (tempMergArr[i] <= tempMergArr[j]) {
                    array[k] = tempMergArr[i];
                    i++;
                } else {
                    array[k] = tempMergArr[j];
                    j++;
                }
                k++;
            }
            while (i <= middle) {
                array[k] = tempMergArr[i];
                k++;
                i++;
            }
    
        }
    }
    
    0 讨论(0)
  • 2020-12-03 06:13

    Might as well add my take on this: Takes two int arrays and merges them. Where 'result' is an array of size a.length + b.length

    public static void merge( int[] a, int[] b, int[] result )
    {
      int i = 0, j = 0;
    
      while ( true )
      {
        if ( i == a.length )
        {
          if ( j == b.length )
            return;
    
          result[ i + j ] = b[ j ]; 
          j++;
        }
        else if ( j == b.length )
        {
          result[ i + j ] = a[ i ];
          i++;
        }
        else if ( a[ i ] < b[ j ] )
        {
          result[ i + j ] = a[ i ];
          i++;
        }
        else
        {
          result[ i + j ] = b[ j ];
          j++;
        }
      }
    }
    
    0 讨论(0)
  • 2020-12-03 06:19
    public void sort(int[] randomNumbersArrray)
    {
        copy = randomNumbersArrray.clone();
        mergeSort(0 , copy.length - 1);
    }
    
    private void mergeSort(int low, int high)
    {
        if(low < high)
        {
            int mid = ((low + high) / 2);
            mergeSort(low, mid); //left side
            mergeSort(mid + 1, high); // right side
            merge(low, mid, high); //combine them
        }
    
    }
    
    
    private void merge(int low, int mid, int high)
    {
        int temp[] = new int[high - low + 1];
        int left = low;
        int right = mid + 1;
        int index = 0;
    
        // compare each item for equality
        while(left <= mid && right <= high)
        {
            if(copy[left] < copy[right])
            {
                temp[index] = copy[left];
                left++;
            }else
            {
                temp[index] = copy[right];
                right++;
            }
            index++;
        }
    
        // if there is any remaining loop through them
        while(left <= mid || right <= high)
        {
            if( left <= mid)
            {
                temp[index] = copy[left];
                left++;
                index++;
            }else if(right <= high)
            {
                    temp[index] = copy[right];
                    right++;
                    index++;
            }
        }
        // copy back to array
        for(int i = 0; i < temp.length; i++)
        {
            copy[low + i] = temp[i];
        }
    }
    
    0 讨论(0)
  • 2020-12-03 06:19

    The above codes are a little confused Never use variables with names: "k", "j", "m",... this makes the code very confusing

    Follows the code in an easier way...

    import java.util.Arrays;
    
    public class MergeSort {
    
        public static void main(String[] args) {
            Integer[] itens = {2,6,4,9,1,3,8,7,0};
    
            Integer[] tmp = new Integer[itens.length];
            int left = 0;
            int right = itens.length - 1;
    
            mergeSort(itens, tmp, left, right);
    
            System.out.println(Arrays.toString(itens));
        }
    
        private static void mergeSort(Integer[] itens, Integer[] tmpArray, int left, int right) {
    
            if(itens == null || itens.length == 0 || left >= right){
                return;
            }
    
            int midle = (left + right) / 2;
    
            mergeSort(itens, tmpArray, left, midle);
            mergeSort(itens, tmpArray, midle + 1, right);
    
            merge(itens, tmpArray, left, midle + 1, right);
        }
    
        private static void merge(Integer[] itens, Integer[] tmpArray, int left, int right, int rightEnd) {
            int leftEnd = right - 1;
            int tmpIndex = left;
    
            while (left <= leftEnd && right <= rightEnd){
                if (itens[left] < itens[right] ){
                    tmpArray[tmpIndex++] = itens[left++];
                } else {
                    tmpArray[tmpIndex++] = itens[right++];
                }
            }
    
            while (left <= leftEnd) { // Copy rest of LEFT half
                tmpArray[tmpIndex++] = itens[left++];
            }
            while (right <= rightEnd) { // Copy rest of RIGHT half
                tmpArray[tmpIndex++] = itens[right++];
            }
            while(rightEnd >= 0){ // Copy TEMP back
                itens[rightEnd] = tmpArray[rightEnd--];
            }
        }
    }
    
    0 讨论(0)
  • 2020-12-03 06:20
    public class MergeSort{
    public static void sort(int[] in){
        if(in.length <2) return; //do not need to sort
        int mid = in.length/2;
        int left[] = new int[mid];
        int right[] = new int[in.length-mid];
        for(int i=0; i<mid; i++){ //copy left
            left[i] = in[i];
        }
        for(int i=0; i<in.length-mid; i++){ //copy right
            right[i] = in[mid+i];
        }
        sort(left);
        sort(right);
        merge(left, right, in);
    }
    
    private static void merge(int[] a, int[] b, int[] all){
        int i=0, j=0, k=0;
        while(i<a.length && j<b.length){ //merge back
            if(a[i] < b[j]){
                all[k] = a[i];
                i++;
            }else{
                all[k] = b[j];
                j++;
            }
            k++;
        }
        while(i<a.length){ //left remaining
            all[k++] = a[i++];
        }
        while(j<b.length){ //right remaining
            all[k++] = b[j++];
        }
    }
    
    public static void main(String[] args){
        int[] a = {2,3,6,4,9,22,12,1};
        sort(a);    
        for(int j=0; j<a.length; j++){
            System.out.print(a[j] + " ");
        }   
     }
    }
    
    0 讨论(0)
提交回复
热议问题