下面是我對數組的反轉的實現。對於某些輸入,它會產生所需的結果。爲例如:用於計數的合併排序實現數組的反轉
1:0,1,2,3,4,5,6,7,8,9 - > 0反轉(正確)
2:1000,999,998,997,..... ..3,2,1 - > 499500反轉(正確)
3:-1,3,5,2,4,6- - > 3反轉(正確)
但對於
4: 9,10,8,1,4,7,6,2,5,3 - > 41反轉(錯誤)。正確答案是33。
public class Assignment1 {
static int[] result = new int[10];
public static long divideW (int Arr[]) {
long countLeft ;
long countRight ;
long countMerge ;
int mid = (Arr.length)/2;
if (Arr.length <= 1)
return 0;
else
{
int leftArr[] = new int [mid];
int rightArr[] = new int [Arr.length - mid];
for (int i = 0; i < mid; i++){
leftArr[i] = Arr[i];
}
for (int j = 0; j < rightArr.length ; j++){
rightArr[j] = Arr[mid + j];
}
countLeft = divideW (leftArr);
countRight = divideW (rightArr);
//int[] result = new int[Arr.length];
countMerge = conquer(leftArr, rightArr, result);
return (countLeft + countRight + countMerge);
}
}
public static long conquer (int []l, int[]r, int[] result) {
int i = 0;
int j = 0;
int k = 0;
long count = 0;
while ((i < l.length) && (j < r.length)) {
if (l[i] <= r [j]) {
result[k] = l[i++];
}
else if (l[i] > r[j]) {
result[k] = r[j++];
count += l.length - i;
}
++k;
}
while (i < l.length) {
result[k++] = l[i++];
}
while (j < r.length) {
result[k++] = r[j++];
}
return count;
}
public static void main(String[] args) {
Assignment1 rs = new Assignment1();
int anArr[] = {9,10,8,1,4,7,6,2,5,3};
System.out.println (rs.divideW(anArr));
for (int i = 0 ; i < result.length; ++i) {
System.out.println (result[i]);
}
}
}
@PLB目標不是簡單地刪除Homework標記。你需要做大量的編輯。如果問題太具體或只是可怕的標誌,它可以被關閉或刪除(如[這一個](http://stackoverflow.com/questions/11174910/basic-java-teaching-recources))。如果問題很大,只能刪除Homework標記,但這很少見。 – Sam
upsi,對不起:)好吧我從現在開始注意 – PLB