arrays - 给定一个有序数组,其中有几个数字是颠倒的。如何排序?

标签 arrays algorithm sorting language-agnostic

我实际上是在尝试解决一个问题,我有一个已排序的数组,但有几个数字是相反的。例如:1 2 3 4 9 8 7 11 12 14 是数组。

现在,我的第一个想法是应用 二分搜索 算法来查找 PEAK ( a[i]>a[i+1] && a[i]>a[i- 1])

但是,我觉得它可能不会总是给出正确的结果。此外,它可能效率不高,因为列表几乎已排序。

下一个印象:应用插入排序,因为列表已排序,如果我没记错的话,插入排序在这种情况下提供最佳性能。

那么谁能提出更好的解决方案或者我的解决方案是否正确?高效还是低效?

P.S - 这不是家庭作业!

更新:插入排序(在这种情况下为 O(n))或线性扫描以找到子序列,然后再次反转它(O(n))。如果我们可以优化它,有机会吗?或者可能在 O(logn) 中执行?

最佳答案

线性搜索第一个反转(即 a[i+1] < a[i] ),调用其索引 inv1 .继续直到反转停止,调用最后一个索引 inv2 .反转 inv1 之间的数组和 inv2 , 包括在内。

在您的示例中,inv1是 4,inv2是 6;数组元素从零开始编号。

该算法与原始条目数成线性关系。

关于arrays - 给定一个有序数组,其中有几个数字是颠倒的。如何排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11724879/

相关文章:

c - 二维数组分配函数中的 Malloc 调用有时会崩溃

python - 在 Python 中实现 Karatsubas 乘法算法

algorithm - 政党排名-面试解决方案

mysql - 如何对 MYSQL 中的字母数字列进行排序?

java - 根据整数对 ArrayList 进行排序

PHP - RecursiveArrayIterator 在除最后一级之外的所有级别上递归

javascript - 从一对多关系获取和保存值,并在 Laravel 的 javascript 中使用

algorithm - 播放或访问时蒙特卡洛树搜索中的置信上限为 0

c++ - 为 vector 类编写 sort() 方法

java:将一个值添加到二维数组中的一列