[英]Counting inversions in a vector using mergesort c++
對於我發送給它的某些輸入,該算法返回一個錯誤。 我先用數組寫了merge_sort和inversion_count; 從而返回正確數量的反轉。 轉換到向量后,我將收到以下輸入的減一:2 4 1 3 5
一雙新鮮的眼睛將不勝感激。
vector<int> a;
object o;
length = a.size();
inv = o.count_inversion(a, 0, length-1);
int inversion::merge_and_count(vector<int> vector1, int alpha, int omega)
{
int inversion = 0;
int mid = (alpha + omega) / 2;
int i = alpha;
int j = mid + 1;
int lastITR = 0;
vector<int> final(omega - alpha + 1);
while (i <= mid && j <= omega) {
if (vector1[i] <= vector1[j])
{
final[lastITR++] = vector1[i++];
}
else
{
final[lastITR++] = vector1[j++];
inversion += mid - i + 1;
}
}
while (i <= mid)
{
{
final[lastITR++] = vector1[i++];
}
while (j <= omega)
{
final[lastITR++] = vector1[j++];
}
for (int k=0 ; k < omega-alpha+1; k++)
{
vector1[k+alpha] = final[k];
}
return inversion;
}
int inversion::count_inversion(vector<int> vector1, int a, int b)
{
int x, y, z, mid;
if (a >= b)
{
return 0;
}
mid = (a+b)/2;
x = count_inversion(vector1, a, mid);
y = count_inversion(vector1, mid+1, b);
z = merge_and_count(vector1, a, b);
return x + y + z;
}
以下是可能導致您的問題的一件事(請注意:我不知道您要做什么,但實際上我認為這並不重要):
int inversion::merge_and_count(vector<int> vector1, int alpha, int omega)
// note: pass by *value*, not reference ------^
顯然,您打算為調用者實際修改此引導程序,因為在例程結束時:
for (int k=0 ; k < omega-alpha+1; k++)
{
vector1[k+alpha] = final[k];
}
本質上,您正在構建合並的final
,然后將其復制到將要銷毀的向量中。 完成此操作后,調用者方的vector<int>
保持不變,保持與先前相同。
通過使用參考解決此問題:
int inversion::merge_and_count(vector<int>& vector1, int alpha, int omega)
// note: reference -----------------------^
有一些潛在的問題,但這很可能使您感到悲傷。 可以count_inversion
值傳遞到count_inversion
,因為尚不清楚您是否要在此處修改調用方向量,並且如果這僅在計算反轉,則可能不希望這樣做。 但是merge_and_count
需要使用引用。
注意:學習迭代器后,您將很高興將其用於建模。 它不僅使代碼更清晰,而且可以自動在支持正確迭代器類型的任何序列容器上使用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.