我有数据(3 是支点):
281374
我从左右移动两个指针
首先我有 2 和 4 所以我什么都不交换
然后我有 8 和 7 所以我交换并有:
273184
现在我在 3 和 1 中有 pinter,所以我交换:
271384
现在 left pointer = rightpointer - 1 所以我应该快速排序这些:
271 | 384
分开对吗?
但如果我这样做,我会得到这样的东西:
127 | 348
这不是排序的数据!
我做错了什么?
问题是:
然后我有 8 和 7 所以我交换并有:
273184
你不交换这些值。左边大于枢轴的所有东西都必须放在右边,右边低于枢轴的所有东西都必须放在左边。但是 7 和 8 都比枢轴元素大。
看到人们跳快速排序算法: http ://www.youtube.com/watch?v=ywWBy6J5gz8
高温高压
如果左侧大于右侧,则不会交换相应的数字,您将根据它们与枢轴值的比较来交换它们。 7
已经大于枢轴值,因此它已经在枢轴的正确(右侧)侧。
但是,就地分区的标准算法与您似乎正在尝试的完全不同。查看Wikipedia 文章中的就地快速排序。
快速排序不是这样工作的
如果 3 是您的支点:
交换您的枢轴 (3),与末端
281374 -> 281473
281473
-
2小于3吗?是的,但它已经在左边,所以别管它
281473
-
8 小于 3 吗?不,所以我们需要找出下一个正确的放置位置。沿着列表向下走,第一项 <= 我们交换的枢轴(它可以是枢轴本身)。在这种情况下,它是1
如此......
281473 -> 218473
现在我们在
218473
-
重复直到排序。
3 是枢轴然后检查 2:2 小于 3 所以什么都不做 8 大于枢轴所以它移动到数组的末尾 1 小于 3 :什么都不做,其他元素大于 3 并且现在我们有:213748 现在我们把这个数组分成两个子数组,让它们的第一个元素旋转并用快速排序对它们进行排序 123748 123478 hip hip hurray 我们对它进行排序