【发布时间】:2019-10-14 08:03:23
【问题描述】:
我正在尝试实现以下算法来查找文本文件中给出的第 k 个最大输入数。第一个数字确定 k 变量,下一个数字确定元素的总数 (N),其余的是数字列表。 算法描述为:
- 仅存储数组中的前 k 个数字
- 按降序对数组进行排序,例如,使用插入排序
- 一一阅读其余数字:
- 如果小于数组中第k个位置的数字则忽略
- 否则;将其插入数组中的正确位置并移动 剩余数字(第k个位置的数字将被抛出 数组外)
- 返回数组中索引 k-1 处的数字。
AlgorithmSortK::AlgorithmSortK(int k) : SelectionAlgorithm(k)
{
this->k = k;
}
int AlgorithmSortK::select()
{
int N = 0;
int x=0;
int *pNums = 0;
cin>>N;
cout<<"N:"<<N<<endl;
pNums = new int[N];
int key, j;
for (int i=0; i<k; i++)
{
cin>>x;
pNums[i] = x;
cout<<pNums[i]<<endl;
for (i = 1; i <k; i++)
{
key = pNums[i];
j = i - 1;
while (j >= 0 && pNums[j] <key)
{
pNums[j + 1] = pNums[j];
j = j - 1;
}
pNums[j + 1] = key;
}
for ( i=k; i<N; i++)
{
cin>>x;
if(x>pNums[k-1])
{
for (int shifter=0; shifter<k; shifter++)
{
pNums[shifter]=x;
pNums[shifter] = pNums[shifter+1];
}
for (int r = 1; r <k; r++)
{
key = pNums[r];
j = r - 1;
while (j >= 0 && pNums[j] <key)
{
pNums[j + 1] = pNums[j];
j = j - 1;
}
pNums[j + 1] = key;
}
}
}
cout<<"pNums[k-1]:"<<pNums[k-1]<<endl;
}
这是我的代码,它可以正确编译,但 pNums[k-1] 的结果不同且不正确。我认为我在 k-1 索引操作中错误地移动和删除了元素。 N 是元素的总数,我正在对 k 限制数组使用插入排序。
【问题讨论】:
-
“
pNums = new int[N]”。想法是只存储K元素,所以你已经可以在这里减小大小了。 -
看来你的第一个循环不应该包含其他循环。
-
第一个 for 循环的 {} 括号似乎有问题
标签: c++ arrays algorithm pointers