我正在尝试对遗传类型数组实现合并排序算法。问题是结果不正确,因为某些元素被设置为 0。我怀疑问题来自于我在整个程序中所做的转换,但我不知道确切的原因。
正如您在 sortUsingMerge() 中看到的,我将一个对象数组转换为通用数组。同样在下面的 IF 语句中,我将数组中的 Object 元素转换为 int 以便能够比较 2 个元素。我的意图是排序算法应该适用于任何类型的任何数组,但我只是暂时不想为每种类型编写比较器。
Input array: 5 1 -2 3 7 8 0
Output: -2 0 1 1 3 7 0
看起来数字 5 和 8 在排序过程中以某种方式转换为不同的数字。有人可以告诉我为什么吗?谢谢!
Source code:
public void sortUsingMerge(){
Object[] array = (E[]) new Object[size];
Object[] helper = (E[]) new Object[size];
mergeSort(array,helper,0,size-1);
}
public void mergeSort(Object[] array, Object[] helper, int low, int high){
if (low<high){
int mid = (low + high)/2;
mergeSort(array,helper,low,mid); //sort left half
mergeSort(array,helper,mid+1,high);//sort right half
merge(array,helper,low,mid,high);
}
}
public void merge(Object[] array, Object[] helper, int low, int mid, int high){
for (int i=low; i<=high; i++){// copy both parts into helper array
helper[i] = array[i];
}
int helperLeft = low;
int helperRight = mid + 1;
int current = low;
while (helperLeft <= mid && helperRight <=high){
if ((int)helper[helperLeft] <= (int)helper[helperRight]){
array[current] = helper[helperLeft];
helperLeft++;
}
else{
array[current] = helper[helperRight];
helperRight++;
}
current++;
}
int remain = mid - helperLeft;
for (int i=0; i<remain; i++){
array[current+i] = helper[helperLeft + i];
}
}
最佳答案
内部合并替换
for (int i=0; i<remain; i++){
array[current+i] = helper[helperLeft + i];
}
与
while (helperLeft <= mid) {
array[current] = helper[helperLeft];
current++;
helperLeft++;
}
关于java - 对通用类型的数组进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20159643/