家庭作业。我得到合并排序。我不明白

问题描述 投票:-1回答:1

我阅读了1000遍代码,但我看不出要进行适当的排序需要填什么空白。到目前为止,这将返回堆栈溢出错误。我的背景是Java入门课程的一半,现在我是数据结构和算法方面的主管。算法很有趣。这个过程太可怕了。

合并排序

开发合并排序方法,它将对整数值的数组进行排序

您需要在四个地方进行修改正确执行排序。这些地方均标有文档→//要做(#1),(#2),(#3a-d)和(#4)。

[如果您运行该应用程序并输入'8',输出应与列出的输出相同。

样本输出:

下面的示例输出显示了MergeSort算法以及调试输出的日志显示算法的进度:

合并排序测试

输入整数元素的数量:

8

输入8个整数元素

元素1:6

元素2:5

元素3:3

元素4:1

元素5:7

元素6:8

元素7:2

元素8:4

呼叫分类:低[0],高[4]

呼叫分类:低[0],高[2]

呼叫分类:低[0],高[1]

呼叫分类:低[1],高[2]

合并2个元素

当前数组:5 6

呼叫分类:低[2],高[4]

呼叫分类:低[2],高[3]

呼叫分类:低[3],高[4]

合并2个元素

当前数组:1 3

合并4个元素

当前数组:1 3 5 6

呼叫分类:低[4],高[8]

呼叫分类:低[4],高[6]

呼叫分类:低[4],高[5]

呼叫分类:低[5],高[6]

合并2个元素

当前数组:7 8

呼叫分类:低[6],高[8]

呼叫分类:低[6],高[7]

呼叫分类:低[7],高[8]

合并2个元素

当前数组:2 4

合并4个元素

当前数组:2 4 7 8

合并8个元素

当前数组:1 2 3 4 5 6 7 8

排序后的元素

1 2 3 4 5 6 7 8

package mergesort;

import java.util.Scanner;

/* Class MergeSort */
public class MergeSort 
{
   /* Merge Sort function */
   public static void sort( int[] array, int low, int high ) 
   {
      int      diff;
      int      midpoint;

      /* Calculate Difference between low and high */
      diff = high-low;         

      /* Recursion is called until diff is less than or equal to 1 */
      /* Return if less than or equal to 1 */
      if ( diff <= 1 ) 
      {
         return; 
      }

      /* Calculate the midpoint between low and diff */
      midpoint = low + diff/2; 

      // We will call sort recursively here, once for the lower half of the 
      // provided array and once for the upper half of the array
      System.out.printf( "Calling sort: low [%d], high [%d]\n", low, midpoint );

//要做(#1):对数组的下半部分进行排序

 sort(array, low, midpoint); // is this correct

      System.out.printf( "Calling sort: low [%d], high [%d]\n", midpoint, high );

//要做(#2):对数组的上半部分进行排序

 sort(array, high - midpoint, high); // is this correct

      // Merge Two Sorted Subarrays
      // Create temporary array and temporary variables
      int[] temp = new int[diff];
      int i = low, j = midpoint;

      System.out.printf( "Merging %d Elements\n", diff );
      for ( int k = 0; k < diff; k++ ) 
      {
         // Fill in temporary array as necessary
         if ( i == midpoint )
         {

要做(#3a)当涉及到如何将这两件事合并以及为什么需要4个条件时,我完全迷失了。我本来希望从头开始编写代码。

     temp[k] = array[j];//is this correct?
         }
         else if ( j == high ) 
             //midpoint = high; low + diff/2 = high; low + (high-low)/2 = high;
             //low/2 = high/2; low = high;         
         {

//要做(#3b)

 temp[k] = array[i];
         }
         else if ( array[j] < array[i] ) 
         {

//要做(#3c)

 temp[k] = array[j];
j++;
         }
         else 
         {

//要做(#3d)

temp[k] = array[i];
i++
         }
      }    
      System.out.print( "Current Array: " );
      for ( int k=0; k<diff; k++ ) 
      {

//要做(#4):用临时数组元素填充数组

  array[k] = temp[k];
         System.out.printf( "%d ", array[low+k] );
      }
      System.out.println();
   }


   /* Main method */
   public static void main(String[] args) 
   {
      Scanner keyboard = new Scanner( System.in );        
      int     elements, lp;
      int     intArray[] = null;

      System.out.println( "Merge Sort Test\n" );

      /* Accept number of elements */
      System.out.println( "Enter Number of Integer Elements: " );
      elements = keyboard.nextInt();

      /* Create array of n elements */
      intArray = new int[ elements ];

      /* Read Elements from the keyboard */
      System.out.println( "\nEnter " + elements + " integer elements" );
      for ( lp=0; lp<elements; lp++ )
      {
         System.out.print( "Element " + ( lp+1 ) + ": " );
         intArray[lp] = keyboard.nextInt();
      }
      /* Call method sort */
      sort( intArray, 0, elements );

      /* Print sorted Array */
      System.out.println( "\nElements After Sorting" );        

      for ( lp=0; lp<elements; lp++ )
      {
         System.out.print( intArray[lp] + " " );            
      }
      System.out.println();            
   }    
}
java loops sorting conditional-statements mergesort
1个回答
0
投票

这里似乎没有愚蠢的问题。对不起,我问。我有一本书。我阅读了有关合并排序的信息。为什么极客对于极客会有所帮助。我至少应该弄清楚这个调试器的作用是什么,以防万一它有用。

© www.soinside.com 2019 - 2024. All rights reserved.