【问题标题】:Implementing own quicksort on dynamic array在动态数组上实现自己的快速排序
【发布时间】:2012-02-29 14:19:48
【问题描述】:

我必须在动态字符串数组上实现自己的排序,例如这样的数组是:

string * sortArray;

然后我从一个文本文件中读取数组的大小,并根据需要使数组变长并填充它。所以,我有...

sortArray = new string[_numberOfNames];

for(int i = 0; i < _numberOfNames; ++i){
    sin >> _data[i];
}

现在我需要创建自己的排序方法,我想我会使用快速排序。我的问题是,我不知道该怎么做。

当我选择一个枢轴时,我该如何设置另外两个动态字符串数组来放入较低的值和较高的值,然后递归?在我开始将值放入其中之前,无法事先知道每个数组需要多大。

我想我可以做一些事情,比如将每个数组的大小定义为与被排序的数组相同,然后如何从末尾删除任何不需要的空格,但我不确定这是否可能?

任何帮助将不胜感激。

附:我知道 std::sort,我已经在程序中有这个,我只是想自己实现一个排序。

【问题讨论】:

  • 为什么不使用可变大小的 std::vector?
  • 快速排序就地完成。您不需要创建额外的数组。
  • 尝试使用 std::vector,而不是数组。
  • 另外,如果您查看en.wikipedia.org/wiki/Quicksort,您会看到算法的“就地”版本不需要额外的内存。
  • 您没有设置两个额外的阵列。您就地对原始阵列进行分区。这意味着您对数组中的元素进行混洗,使较低的值位于较低端,较高的值位于较高端。查看维基百科文章以了解它是如何完成的。甚至还有 youtube 视频。

标签: c++ arrays sorting dynamic quicksort


【解决方案1】:

上述 cmets 的两个选项:

1.) 使用 std::vector。在那里你可以有可变大小的数组。

2.) 使用“就地”版本的快速排序,在原始数组中进行排序。见http://en.wikipedia.org/wiki/Quicksort#In-place_version

【讨论】:

    【解决方案2】:

    假设你有数组大小N
    你的枢轴值是x

    你应该做的就是这样,有两个指针,一个指向开头(0),一个指向结尾(N-1)。他们都应该移到中间。当开始指针值大于x 并且结束指针值小于x 时,切换它们的值。在你完成并将x 放置在他的新位置(两个指针相遇的地方)之后,继续递归地处理左侧到x 和右侧到x 的部分。

    【讨论】:

      猜你喜欢
      • 2022-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-10
      • 2018-12-02
      • 2018-06-09
      相关资源
      最近更新 更多