我似乎无法弄清楚将比较计数器放在Merge类中的位置。虽然它可以完美地对阵列进行排序,但它不会计算它所进行的交换(或比较)次数。请帮助这是我的最终项目
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;
}
答案 0 :(得分:0)
在此处包含的代码中,您没有显示变量comparisons
的定义,但由于您在没有定义它的情况下使用它,我假设它是您班级中的一个字段。如果是这种情况,我认为问题是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 Merge(int [] intArray,int first,int mid,int last){ int 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;
}