在c++中快速排序数组而不修改它(可能不使用临时数组)

QuickSort an array without modifying it (may not use a temporary array) in C++

本文关键字:数组 c++ 快速排序 修改      更新时间:2023-10-16

通常我不会问我的学校作业关于stackoverflow,但我认为他们想从我们这里得到什么是不可能的,除非使用临时数组或修改数组。

他们想从我们这里得到的是:

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

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

  3. 不能使用临时数组

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

  5. 功能应该是这样的:

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

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

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

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

我将检查其中一个答案,以使标签问题解决。

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

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

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

根据我对问题的理解,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);
}

伙计们,我以为我错过了一些东西,有一种我不知道的方式,在你的评论之后,我打电话给助理,他说当然你需要修改数组,你不可能不修改它。但是在练习声明中,它明确地说

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

再次感谢所有的回答和评论。抱歉大家误会了。