我目前正在使用mergesort進行倒計數練習。我面臨的問題是當我有小型或中型陣列時,結果非常好,但如果我使用非常大的測試用例(100,000個整數數組),它不會給我正確的反轉次數。我不知道爲什麼會發生這種情況。這裏是我的代碼:倒計數(大輸入問題)
static int [] helper;
static long count=0;
static Integer [] arr3;
private static void mergeSortMethod(Integer[] arr3) {
int head=0;
int tail=arr3.length-1;
int mid=tail+((head-tail)/2);
sort(arr3,head,tail);
}
private static void sort(Integer[] arr3, int low, int high) {
if (high<=low){
return;
}
int mid=low+ ((high-low)/2);
sort(arr3,low,mid);
sort(arr3,mid+1,high);
merge3CountInvs(arr3,low,mid,high);
}
private static void merge3CountInvs(Integer[] arr3, int low, int mid, int high) {
int i=low;
int j=mid+1;
int k=low;
//to get size of first half of array
int nArr1Elems=(mid-low)+1;
for (int m=low;m<=high;m++){
helper[m]=arr3[m];
}
while(i < mid+1 && j < high+1){// neither array empty
if(helper[i] < helper[j]){
arr3[k++] = helper[i++];
}
else if (helper[j] < helper[i]){
arr3[k++] = helper[j++];
int numOFElements=nArr1Elems-i;
count=count+(nArr1Elems-i);
}
}
while(i < mid+1){ // arrayB is empty,
arr3[k++] = helper[i++];
}
while(j < high+1){ // arrayA is empty,
arr3[k++] = helper[j++];
}
}
不使用非常大的輸入時,但是當我使用的,這是倒我的編號達到100,000整數測試用例我的解決方案提供了正確答案:
從我的實現: - 30588581433
正確答案是:2407905288個
任何想法?我將不勝感激任何形式的幫助。謝謝。
編輯: 正如在關於整數溢出情況的答案中提到的,這是我難以理解的一點,因爲導致溢出的變量「count」被初始化爲「long」,因此應該沒有溢出這個案例。我想不出任何其他變量會導致我的代碼中的整數溢出。非常感謝。
UPDATE:
有沒有相關的整數溢出,但感謝然而雷迪的答案都指向我到正確的方向,再次感謝答案的問題。在我的算法唯一的錯誤是:
int nArr1Elems=(mid-low)+1;
count=count+(nArr1Elems-i);
當它應該是:
count=count+(mid-i+1);
正如我們從留在陣列的左側的元素減去排序最初沒有當「後」由於索引在排序後發生變化,子程序被調用。我寫在我的情況下更新的代碼是否有人會在一個類似的問題,最終成爲我的:
static int [] helper;
static long count=0;
static Integer [] arr3;
private static void mergeSortMethod(Integer[] arr3) {
int head=0;
int tail=arr3.length-1;
int mid=tail+((head-tail)/2);
sort(arr3,head,tail);
}
private static void sort(Integer[] arr3, int low, int high) {
if (high<=low){
return;
}
int mid=low+ ((high-low)/2);
sort(arr3,low,mid);
sort(arr3,mid+1,high);
merge3CountInvs(arr3,low,mid,high);
}
private static void merge3CountInvs(Integer[] arr3, int low, int mid, int high) {
int i=low;
int j=mid+1;
int k=low;
for (int m=low;m<=high;m++){
helper[m]=arr3[m];
}
while(i < mid+1 && j < high+1){// neither array empty
if(helper[i] < helper[j]){
arr3[k++] = helper[i++];
}
else if (helper[j] < helper[i]){
arr3[k++] = helper[j++];
//to increment count with total number of elements left in arrayA after sorting
count=count+(mid-i+1);
}
}
while(i < mid+1){ // arrayB is empty,
arr3[k++] = helper[i++];
}
while(j < high+1){ // arrayA is empty,
arr3[k++] = helper[j++];
}
}
「*我將不勝感激任何** **排序的幫助。*」雙關語意做錯了什麼? – jason
我可以在你的算法中看到一些錯誤。請檢查我的回答 – Reddy