Java 合并排序比较计数器

Java 合并排序比较计数器,java,sorting,comparison,mergesort,Java,Sorting,Comparison,Mergesort,我似乎不知道在合并类中把比较计数器放在哪里。尽管它对数组进行了完美的排序,但它不会计算所进行的交换(或比较)的数量。请帮忙,这是我最后一个项目的一部分 public static int mergeSort(int[] intArray, int first, int last) { if(first < last) { int mid = (first + last) / 2; mergeSort(intArray, f

我似乎不知道在合并类中把比较计数器放在哪里。尽管它对数组进行了完美的排序,但它不会计算所进行的交换(或比较)的数量。请帮忙,这是我最后一个项目的一部分

      public static int mergeSort(int[] intArray, int first, int last) {
        if(first < last) {
          int mid = (first + last) / 2;
          mergeSort(intArray, first, mid);
          mergeSort(intArray, mid + 1, last);
          Merge(intArray, first, mid, last);

     }

     return comparisons;

  }

  public static int Merge(int[] intArray, int first, int mid, int last) {

     //int count = 0;
     comparisons = 0;
     int first1 = first, last1 = mid;
     int first2 = mid + 1, last2 = last;
     int temp[] = new int[intArray.length];
     int index = first1;

     while(first1 <= last1 && first2 <= last2) {
        if(intArray[first1] < intArray[first2]) {
           temp[index] = intArray[first1++];
           comparisons++;
        }
        else
            temp[index] = intArray[first2++];
            index++;
            comparisons++;
     }

     while(first1 <= last1)
        temp[index++] = intArray[first1++];

     while(first2 <= last2)
        temp[index++] = intArray[first2++];

     for(index = first; index <= last; index++)
        intArray[index] = temp[index];


     return comparisons;
  }
public static int mergeSort(int[]intArray,int first,int last){
如果(第一次<最后一次){
int mid=(第一个+最后一个)/2;
合并排序(intArray、first、mid);
合并排序(intArray,mid+1,last);
合并(阵列内、第一、中间、最后);
}
回报比较;
}
公共静态整型合并(整型[]整型数组,整型第一,整型中间,整型最后){
//整数计数=0;
比较=0;
int first1=第一,last1=中间;
int first2=mid+1,last2=last;
int temp[]=新int[intArray.length];
int指数=first1;

虽然(first1在您包含的代码中,您没有显示变量
comparison
的定义,但是由于您使用它时没有定义它,我假设它是类中的一个字段。如果是这样,我认为问题在于
Merge
中的这一行:

comparisons = 0;
由于您有一个全局计数器来计算所做比较的数量,因此这一行的出现意味着无论何时调用
Merge
,您都会将比较总数重置回零,即使在执行mergesort的过程中您已经进行了一系列比较

作为一个快速解决方案,只需删除这一行。但是,我认为您最好不要将其作为字段,而是使用返回值来反馈所做比较的数量。有一种方法可以做到这一点:

  public static int mergeSort(int[] intArray, int first, int last) {
    int compares = 0;
    if(first < last) {
      int mid = (first + last) / 2;
      compares += mergeSort(intArray, first, mid);
      compares += mergeSort(intArray, mid + 1, last);
      compares += Merge(intArray, first, mid, last);

 }

 return compares;
public static int mergeSort(int[]intArray,int first,int last){
int=0;
如果(第一次<最后一次){
int mid=(第一个+最后一个)/2;
比较+=合并排序(intArray、first、mid);
比较+=合并排序(intArray,mid+1,last);
比较+=合并(数组内、第一个、中间、最后一个);
}
回报比较;
}

公共静态整型合并(整型[]整型数组,整型第一,整型中间,整型最后){ 整数比较=0; int first1=第一,last1=中间; int first2=mid+1,last2=last; int temp[]=新int[intArray.length]; int指数=first1

 while(first1 <= last1 && first2 <= last2) {
    if(intArray[first1] < intArray[first2]) {
       temp[index] = intArray[first1++];
       comparisons++;
    }
    else
        temp[index] = intArray[first2++];
        index++;
        comparisons++;
 }

 while(first1 <= last1)
    temp[index++] = intArray[first1++];

 while(first2 <= last2)
    temp[index++] = intArray[first2++];

 for(index = first; index <= last; index++)
    intArray[index] = temp[index];


 return comparisons;

while(first1在这里包含的代码中,您没有显示变量
比较的定义,但是由于您使用它时没有定义它,我假设它是类中的一个字段。如果是这样,我认为问题在于
合并中的这一行:

comparisons = 0;
由于您有一个全局计数器来计算所做比较的数量,因此这一行的出现意味着无论何时调用
Merge
,您都会将比较总数重置回零,即使在执行mergesort的过程中您已经进行了一系列比较

作为一个快速解决方案,只需删除这一行。但是,我认为您最好不要将其作为字段,而是使用返回值来反馈所做比较的数量。有一种方法可以做到这一点:

  public static int mergeSort(int[] intArray, int first, int last) {
    int compares = 0;
    if(first < last) {
      int mid = (first + last) / 2;
      compares += mergeSort(intArray, first, mid);
      compares += mergeSort(intArray, mid + 1, last);
      compares += Merge(intArray, first, mid, last);

 }

 return compares;
public static int mergeSort(int[]intArray,int first,int last){
int=0;
如果(第一次<最后一次){
int mid=(第一个+最后一个)/2;
比较+=合并排序(intArray、first、mid);
比较+=合并排序(intArray,mid+1,last);
比较+=合并(数组内、第一个、中间、最后一个);
}
回报比较;
}

公共静态整型合并(整型[]整型数组,整型第一,整型中间,整型最后){ 整数比较=0; int first1=第一,last1=中间; int first2=mid+1,last2=last; int temp[]=新int[intArray.length]; int指数=first1

 while(first1 <= last1 && first2 <= last2) {
    if(intArray[first1] < intArray[first2]) {
       temp[index] = intArray[first1++];
       comparisons++;
    }
    else
        temp[index] = intArray[first2++];
        index++;
        comparisons++;
 }

 while(first1 <= last1)
    temp[index++] = intArray[first1++];

 while(first2 <= last2)
    temp[index++] = intArray[first2++];

 for(index = first; index <= last; index++)
    intArray[index] = temp[index];


 return comparisons;

while(首先1)您是否从其他人那里复制了此代码?放置
比较的位置与编写合并的任务相比微不足道。因此记住,缩进并不意味着代码将在没有正确括号的情况下执行。您的其他人缺少parens。您是否从其他人那里复制了此代码?放置到与编写合并的任务相比,put
comparations
是微不足道的。因此请记住,缩进并不意味着代码在没有正确括号的情况下会像那样执行。您的其他代码缺少括号。