C++ 如何查找未排序的数字(线性搜索)

C++ 如何查找未排序的数字(线性搜索),c++,performance,search,C++,Performance,Search,给出了一个n个数的偏序列表,我必须找到那些不按顺序排列的数(只需找到并计数) 没有重复的数字 没有负数 MAX=100000是列表的容量 n,列表中的元素数由用户给定 两个列表的示例: 1 2 5 6 3 16297481013 对于第一个列表,输出为2,因为5和6都应该在3之后,它们是无序的;第二个输出为3,因为6、9和7的顺序不正确 这个问题中最重要的条件是:以线性方式进行搜索O(n),或者在最坏的情况下是二次搜索 这是我开发的代码的一部分(但是它是无效的,因为它是二次搜索) “无序”函

给出了一个n个数的偏序列表,我必须找到那些不按顺序排列的数(只需找到并计数)

  • 没有重复的数字
  • 没有负数
  • MAX=100000
    是列表的容量
  • n
    ,列表中的元素数由用户给定
两个列表的示例:

1 2 5 6 3

16297481013

对于第一个列表,输出为2,因为5和6都应该在3之后,它们是无序的;第二个输出为3,因为6、9和7的顺序不正确

这个问题中最重要的条件是:以线性方式进行搜索O(n),或者在最坏的情况下是二次搜索

这是我开发的代码的一部分(但是它是无效的,因为它是二次搜索)

“无序”函数将数组的每个元素与“最小”函数给出的元素进行比较;如果它发现一个大于最小值,则该元素是无序的

int unordered (int A[MAX], int n)
int cont = 0;

for (int i = 0; i < n-1; i++){
    if (A[i] > minimal(A, n, i+1)){
        count++;
    }
}

return count;
int无序(int A[MAX],int n)
int cont=0;
对于(int i=0;i最小值(A,n,i+1)){
计数++;
}
}
返回计数;

“minimal”函数获取列表中所有元素的最小值,即“无序”函数中比较的元素与列表中最后一个元素之间的最小值
i
由于您最多从列表中删除“n”个数字,并按顺序比较其余的数字,因此此算法使用O(n)表示

我希望这有帮助。我必须承认,查找无序数字的任务并不十分明确。

如果O(n)空间没有问题,您可以先在数组上进行线性运行(向后),然后将到目前为止的最小值保存到另一个数组中。不调用minimal,您可以在O(1)中查找最小值,您的方法在O(n)中工作

大概是这样的:

int min[MAX]; //or: int *min = new int[n];
min[n-1] = A[n-1];
for(int i = n-2; i >= 0; --i)
    min[i] = min(A[i], min[i+1]);

如果你向后做第一个循环,可以在O(1)空间中完成,因为你只需要记住当前的最小值。

其他人提出了一些很好的答案,但我有一个额外的方法可以让你思考这个问题。使用堆栈

下面是它的帮助:将数组中最左边的元素推到堆栈上。继续执行此操作,直到当前所在的元素(在数组上)小于堆栈顶部。此时,弹出元素并增加计数器。当它大于堆栈顶部时停止,并将其推入。最后,当处理完所有数组元素后,您将得到那些无序的数组元素的计数

运行示例:
1 5 6 3 7 4 10

步骤1:堆栈=>1

步骤2:堆栈=>15

步骤3:堆栈=>1 5 6

第四步:现在我们看到3在。当3小于堆栈顶部时,pop和增量计数器。我们得到:Stack=>13--Count=2

步骤5:堆栈=>1 3 7

第六步:我们现在有4个。重复同样的逻辑。我们得到:Stack=>1 3 4--Count=3

步骤7:堆栈=>1 3 4 10--计数=3。我们完成了


对于时间和空间,这应该是O(N)。如果我错了,请更正。

对于
1 6 2 9 7 4 8 11 12 10 13
,会有什么输出?是否因为
11
故障而导致
12
故障?或者是
10
坏了吗?作业警报。在这种情况下
69711213
坏了。11和12是不正常的,因为8是最接近10的。StackOverflow不是论坛。这是一个问答网站。阅读和。不要编辑您的问题以插入解决方案,发布答案。但是,在这种情况下会发生什么?:
1 5 6 3
。5和6是无序的,因为它们应该在3之后。绝对正确。在这种情况下,您发现6大于3,删除6并返回5(索引n-1)。然后你把5和3比较一下,它又大了一点。所以你去掉5,转到1,比较它,你就完成了。
int min[MAX]; //or: int *min = new int[n];
min[n-1] = A[n-1];
for(int i = n-2; i >= 0; --i)
    min[i] = min(A[i], min[i+1]);