给定一个元素数组,返回一个值数组,这些值与给定数组中的元素数量大于多少?
这里有两个循环的蛮力方法很明显,有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?
答案 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++;
可能会有所帮助。