【问题标题】:QuickSort an array without modifying it (may not use a temporary array) in C++在 C++ 中快速排序数组而不修改它(可能不使用临时数组)
【发布时间】:2015-07-15 08:38:46
【问题描述】:

通常我永远不会在 stackoverflow 上问我的学校练习,但我认为如果不使用临时数组或修改数组,他们想要从我们这里得到什么是不可能的。

他们想要我们的是:

  1. 应该是递归的快速排序函数

  2. 它应该排序(这就是排序算法所做的,哈哈),但它应该保持数组完整,

  3. 不能使用临时数组

  4. 它必须以链表格式返回排序列表。

  5. 函数应该是这样的:

LinkedList *quickSort(int *array, int startPosition, int endPosition)

作为链表返回很容易,排序很容易,但算法的每一步都没有修改?我不这么认为。

我不是说请把解决方案发给我。我只是想让你回答这个问题,是不是不可能?

编辑:“保持数组不变”老师的意思是“不要改变数组的大小,但你可以修改数组的顺序”,所以问题解决了

我会检查其中一个答案,只是为了解决标签问题。

【问题讨论】:

  • 也许“临时数组”是指除了将返回的数组之外的数组?我同意措辞似乎很奇怪。我会要求澄清。
  • 您不能将数组复制到要创建的列表中,然后在该列表上使用快速排序吗?我没有看到任何禁止您修改返回列表的内容。
  • 可以修改后再恢复初始数组吗?
  • 但是该函数使用结构返回一个简单的LinkedList,而不是一个数组。
  • 很确定“澄清我的作业”离题或太宽泛或其他什么。你真的应该问问你的老师。

标签: c++ arrays recursion linked-list quicksort


【解决方案1】:

直接回答您的问题:可以在原地进行快速排序(无需任何临时存储区域。)

因为我不想直接为你完成你的作业:) 这里有一个资源可以帮助你。

http://rosettacode.org/wiki/Sorting_algorithms/Quicksort查看第二种算法

【讨论】:

  • 但是它修改了数组不是吗? "if left ≤ right" "swap array[left] with array[right]" 这里修改了数组。
  • 我认为在家庭作业问题的上下文中,这可能意味着它仍然是一个静态的内存块。如果不能修改内容,或者复制到别处,显然是不合逻辑的。
【解决方案2】:

根据我对问题的理解,quickSort可以定义为

std::list<int> quickSort(int * array, int startPosition, int endPosition) {
    std::list<int> result;
    for (int i = startPosition; i <= endPosition; ++i)
        result.push_back(array[i]);
    QuiskSort(result.begin(), result.end());
    return result;
}

QuickSort 的定义在哪里

template <class Iterator>
inline void QuickSort(Iterator begin, Iterator end) {
    if (end <= begin) return;
    Iterator pivot = begin, middle = begin + 1;
    for (Iterator i = begin + 1; i < end; ++i) {
        if (*i < *pivot) {
            std::iter_swap(i, middle);
            ++middle;
        }
    }
    std::iter_swap(begin, middle - 1);
    QuickSort(begin, middle - 1);
    QuickSort(middle, end);
}

【讨论】:

    【解决方案3】:

    伙计们,我以为我错过了什么,有一种方法我不知道,在你的 cmet 之后我打电话给助手,他说 当然你需要修改数组,你不能没有修改它。但在练习声明中它清楚地说明了

    b) 使用快速排序算法对给定位置之间数组的子数组中的数字进行排序 保持数组不变(不能使用临时数组)

    再次感谢所有答案和 cmets。造成误解的各位见谅。

    【讨论】:

    • 我一直在考虑这个问题,我认为问题的措辞可能有误。我相信当他们说“完好无损”时,他们的意思可能是“到位”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-21
    • 2015-04-14
    • 1970-01-01
    • 2013-08-25
    • 2015-07-06
    • 1970-01-01
    相关资源
    最近更新 更多