簡體   English   中英

使用Mergesort C ++計算向量中的求逆

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM