我正在修改快速排序算法但是我觉得它有点复杂。
假设我的数组具有以下A = {7,1,5,8,2,0}
现在我选择我的轴作为数组的索引2,它的值为5.(最终所有小于5的元素都在LHS上,而更大的元素将在RHS上)
现在我开始从左(索引0)向右移动(索引2),直到我达到大于5的值。如果左侧的值大于枢轴值5,那么它需要移动到右边。为了使它移动到右侧,它需要一个空槽,以便两个值可以互换。所以第一个交换给了我数组
A = {0,1,5,8,2,7}
现在两个元素仍然留在左侧2和7(右侧也向枢轴移动 - 向左,如果它小于epivot,则假设移动到另一侧)。 现在问题是如果右侧没有插槽而左侧的元素需要移动到枢轴的右侧会发生什么?我错过了什么吗?
答案 0 :(得分:1)
好吧,"分区"一步到位,可以通过各种方式实施。
最简单的实现方式是这样:
1)选择一个枢轴元素
2)将pivot元素移动为最右边的元素
3)执行左扫描并按顺序堆叠小于枢轴的所有元素。
4)最后你知道有多少元素更小 - >做最后的交换以确保枢轴元素在正确的位置结束。
我已经从维基中获取了此信息,并为代码添加了数字步骤,只是为了说清楚。
// left is the index of the leftmost element of the subarray
// right is the index of the rightmost element of the subarray (inclusive)
// number of elements in subarray = right-left+1
partition(array, left, right)
pivotIndex := choosePivot(array, left, right) // step 1
pivotValue := array[pivotIndex]
swap array[pivotIndex] and array[right] // step 2
storeIndex := left
for i from left to right - 1 // step 3
if array[i] < pivotValue
swap array[i] and array[storeIndex]
storeIndex := storeIndex + 1
swap array[storeIndex] and array[right] // step 4
return storeIndex
答案 1 :(得分:0)
快速排序的基本思想是,
您选择一个枢轴元素,并尝试将所有元素小于枢轴左侧的枢轴元素,并且大于或等于右侧。这个过程是递归发生的。
当你选择了5时,左边的一个点和右边的另一个点朝向彼此移动,将每个元素与枢轴相比较,如果这两个指针交叉,则用指针交换左指针。
在第一种情况下,你已经交换了0和7,这很好,但是现在索引从一个点前进,现在左指针指向元素1,右指针指向2。右指针停在2,因为它小于枢轴5.,左指针到达8并交换8和2.指针再次前进一次,左指针越过右指针,因此它与2交换。
现在如果你看到,5就在它的正确位置。 看起来像 0,1,2,5,8,7
链接有用:https://www.youtube.com/watch?v=8hHWpuAPBHo
算法:
// left是子数组最左边元素的索引
// right是子数组最右边元素的索引(包括)
//子阵列中的元素数量=右 - 左+ 1
分区(数组,左,右)
pivotIndex := choosePivot(array, left, right)
pivotValue := array[pivotIndex]
swap array[pivotIndex] and array[right]
storeIndex := left
for i from left to right - 1
if array[i] < pivotValue
swap array[i] and array[storeIndex]
storeIndex := storeIndex + 1
swap array[storeIndex] and array[right] // Move pivot to its final place
return storeIndex