使用分治法检查数组是不是已排序

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 编写的,非常接近上面的伪代码,它适用于我制作的案例。

【讨论】:

以上是关于使用分治法检查数组是不是已排序的主要内容,如果未能解决你的问题,请参考以下文章

分治法合并排序

分治法

插入排序分治法归并排序

分治法快速排序

Algs4-1.2.1编写一个Point2D的用例-分治法

高频面试考点(考察分治法):合并k个排序链表