0

我有数据(3 是支点):

281374

我从左右移动两个指针

首先我有 2 和 4 所以我什么都不交换

然后我有 8 和 7 所以我交换并有:

273184

现在我在 3 和 1 中有 pinter,所以我交换:

271384

现在 left pointer = rightpointer - 1 所以我应该快速排序这些:

271 | 384

分开对吗?

但如果我这样做,我会得到这样的东西:

127 | 348

这不是排序的数据!

我做错了什么?

4

4 回答 4

1

问题是:

然后我有 8 和 7 所以我交换并有:

273184

你不交换这些值。左边大于枢轴的所有东西都必须放在右边,右边低于枢轴的所有东西都必须放在左边。但是 7 和 8 都比枢轴元素大。

看到人们跳快速排序算法: http ://www.youtube.com/watch?v=ywWBy6J5gz8

高温高压

于 2013-06-24T14:15:44.620 回答
0

如果左侧大于右侧,则不会交换相应的数字,您将根据它们与枢轴值的比较来交换它们。 7已经大于枢轴值,因此它已经在枢轴的正确(右侧)侧。

但是,就地分区的标准算法与您似乎正在尝试的完全不同。查看Wikipedia 文章中的就地快速排序

于 2013-06-24T14:14:16.943 回答
0

快速排序不是这样工作的

如果 3 是您的支点:

交换您的枢轴 (3),与末端

281374 -> 281473

281473
-

2小于3吗?是的,但它已经在左边,所以别管它

281473
 - 

8 小于 3 吗?不,所以我们需要找出下一个正确的放置位置。沿着列表向下走,第一项 <= 我们交换的枢轴(它可以是枢轴本身)。在这种情况下,它是1如此......

281473 -> 218473

现在我们在

218473
  -

重复直到排序。

于 2013-06-24T14:24:00.823 回答
0

3 是枢轴然后检查 2:2 小于 3 所以什么都不做 8 大于枢轴所以它移动到数组的末尾 1 小于 3 :什么都不做,其他元素大于 3 并且现在我们有:213748 现在我们把这个数组分成两个子数组,让它们的第一个元素旋转并用快速排序对它们进行排序 123748 123478 hip hip hurray 我们对它进行排序

于 2013-06-24T19:08:12.303 回答