程式設計求逆序數
逆序數,也就是乙個排列中當某一對元素的先後次序與標準次序(從小到大)不同時,就說它構成乙個逆序。
如:3 5 2 1 4 的逆序數:2+3+1+0+0=6 ,3與2,1; 5與2,1,4; 2與1,就是找出排列第i個數後有幾個比它小的數,有幾個就有幾個逆序數,遍歷該排列,找出所有逆序數並求和就是該排列的總逆序數。
話不多說,直接上**
#includeint count=0;
int main();
for(int i = 0; i < n; i++)
for(int j = i; j < n; j++)
printf("count = %d\n",count);
return 0;
}
上述方法的時間複雜度為o(n^2)
下面是基於歸併排序的求逆序數的方法,比較關鍵的步驟是合併,合併步驟是將已兩個排好序的陣列進行合併,當a[i]>a[j]時,i到mid間的數都大於a[j],把a[j]放到a[i]前面時,就產生了mid-i+1個逆序數,此時做累加記錄,若a[i]#define n 10
int count = 0;
void merge(int a,int left,int mid,int right)
else
k++; }
while(i<=mid)
b[k++] = a[i++];
while(j<=right)
b[k++] = a[j++];
for(int t = left;t<=right; t++)
a[t] = b[t];}
void reverse_count(int a,int left,int right)
int mid = left + (right-left)/2;
nixu(arr,left,mid);
nixu(arr,mid+1,right);
merge(arr,left,mid,right);
}public void merge(arraylistarr,int left,int mid,int right)else
}while(p<=mid)
while(q<=right)
for(int i=0;iarr = new arraylist<>();
for(int i=0;iarr.size())
while(leftarr.get(q))
// }
// }
arraylistarr1 = new arraylist<>(arr);
solusion2.nixu(arr,0,arr.size()-1);
system.out.println(solusion2.getcnt());
solusion2.setcnt(0);
arr.clear();
arr.addall(arr1);
}sc.close();}}
求逆序數 逆序數 歸併排序
求排列的逆序數 分治 一 題目描述 總時間限制 1000ms 記憶體限制 65536kb 描述 在internet上的搜尋引擎經常需要對資訊進行比較,比如可以通過某個人對一些事物的排名來估計他 或她 對各種不同資訊的興趣,從而實現個性化的服務。對於不同的排名結果可以用逆序來評價它們之間的差異。考慮1...
NYOJ 求逆序數
時間限制 2000 ms 記憶體限制 65535 kb 難度 5 描述在乙個排列中,如果一對數的前後位置與大小順序相反,即前面的數大於後面的數,那麼它們就稱為乙個逆序。乙個排列中逆序的總數就稱為這個排列的逆序數。現在,給你乙個n個元素的序列,請你判斷出它的逆序數是多少。比如 1 3 2 的逆序數就是...
分治 求 逆序數
利用歸併,逆序數等於 左邊逆序數 右邊逆序數,加上 左邊 的每個數與右邊的每個數構成的逆序數。歸併過程 把 左邊和右邊按照從小到大排序 在 merge過程中發現a 右邊 a 左邊 說明 在此左邊p1位置的右側的數都能與 此時的p2位置的 a p2 構成逆序對。故 逐一對a j 進行判斷,累加即可得到...