使用分治法检查数组是不是已排序
Posted
技术标签:
【中文标题】使用分治法检查数组是不是已排序【英文标题】:Check if an array is sorted using Divide and Conquer使用分治法检查数组是否已排序 【发布时间】:2020-06-04 03:53:37 【问题描述】:正如问题所说,我需要用 C 或 Python 编写一个算法,该算法使用分而治之来检查数组是否已排序。我有一个基本的想法,但我似乎无法得出一个明确的答案。 这是我到目前为止得到的,使用伪代码:
isSorted(array, start, end):
if (len(array)) <= 1: return true
if (end - start) == 1: return array[end] > array[start]
middle = (end + start) // 2
return isSorted(array, start, middle) && isSorted(array, middle, end)
这样可以解决问题吗?还是我错过了一些该算法不起作用的边界情况?
【问题讨论】:
这会导致堆栈溢出异常。您不处理 start == end 的情况。您可能认为您使用的是 len(array),但这是完整的数组,而不是传递到当前范围的部分数组。 所以如果 start == end 返回 true,则可以通过添加另一个条件来纠正第一个错误。我的第二个错误,我可以使用 end - start 而不是使用 len。 【参考方案1】:找到了我自己的问题的答案,我很满意,但是在 cmets 中我标记了一些问题。其中之一是当数组中有重复项时我没有处理,并且 len(array) 无法正常工作,因为我从未更改过数组。
def isSorted(array, start, end):
if start == end: return True
if (end - start) == 1: return array[end] >= array[start]
middle = (end + start) // 2
return isSorted(array, start, middle) and isSorted(array, middle, end)
这是用 Python 编写的,非常接近上面的伪代码,它适用于我制作的案例。
【讨论】:
以上是关于使用分治法检查数组是不是已排序的主要内容,如果未能解决你的问题,请参考以下文章