在计算第二个元素在数组中的效率较低时,我在哪里出错?

时间:2015-11-06 08:45:53

标签: c++ arrays recursion mergesort

给定一个元素数组,返回一个值数组,这些值与给定数组中的元素数量大于多少?

这里有两个循环的蛮力方法很明显,有O(n ^ 2),但我想做得更好。因此,我尝试使用修改合并排序。我创建了一个节点,它有两个成员。实际值,以及它小于(计数)的元素数量。计数初始化为零。我的代码如下:

#include <iostream>
#include <map>
#include <vector>
#include <string>
#include <utility>
#include <algorithm>
#include <stack>
#include <queue>
#include <climits>
#include <set>
#include <cstring>
#include <cstdio>
#include <cmath>

using namespace std;


class node 
{
public:
    int val;
    int count;
};

void merge(node *temp,int, int , int );
void mergesort(node *temp, int low, int high)
{
    int mid;
    if (low < high)
    {
        mid=(low+high)/2;
        mergesort(temp,low,mid);
        mergesort(temp,mid+1,high);
        merge(temp,low,high,mid);
    }
    return;
}
void merge(node *temp, int low, int high, int mid)
{
    int i, j, k;
    node c[50];
    i = low;
    k = low;
    j = mid + 1;
    while (i <= mid && j <= high)
    {
        if (temp[i].val < temp[j].val)
        {
            c[k] = temp[i];
            k++;
            i++;
            c[k].count = c[k].count + high-j+1;   // only change which should calculate
        }
        else
        {
            c[k] = temp[j];
            k++;
            j++;
        }
    }
    while (i <= mid)
    {
        c[k] = temp[i];
        k++;
        i++;
    }
    while (j <= high)
    {
        c[k] = temp[j];
        k++;
        j++;
    }
    for (i = low; i <= high; i++)
    {
        temp[i] = c[i];
    }
}
int main()
{
    node a[20];
    node b[20];
    int i;
    cout<<"enter  the elements\n";
    for (i = 0; i < 7; i++)
    {
        cin>>a[i].val;
        a[i].count = 0;
    }
    mergesort(a, 0, 6);
    cout<<"sorted array\n";
    for (i = 0; i < 7; i++)
    {
        cout<<a[i].val<<" "<<a[i].count<<"\n";
    }
    return 0;
}  

但是,上面的输出,0作为所有元素的计数值,但是,它正确地对元素进行排序。例如,输入as,

3 4 5 9 2 1 3  

O / P出现了,

1 0
2 0
3 0
3 0
4 0
5 0
9 0

为什么count为0?

1 个答案:

答案 0 :(得分:2)

以下内容突然出现:

c[k] = temp[i];
k++;
i++;
c[k].count = c[k].count + high-j+1;   // only change which should calculate

为什么将值插入一个元素,然后在下一个中更新计数?我用魔眼看到增加的计数在下一次迭代中被零覆盖,给你你的结果。

将其重写为:

c[k] = temp[i];
c[k].count = c[k].count + high-j+1;   // only change which should calculate
k++;
i++;

可能会有所帮助。