我正在尝试在C中实现此版本的quicksort,但是我陷入了困境。以下是该算法的工作原理。这是我尝试实现的分区方案。代码如下。
17, -10, 7, 19, 21, 23, -13, 31, 59
# ^ ^
start
17, -10, 7, 19, 21, 23, -13, 31, 59
# ^ ^
move left pointer to first element larger than pivot. 3 compares
17, -10, 7, 19, 21, 23, -13, 31, 59
# ^ ^
move right pointer to first element smaller than pivot. 3 compares
17, -10, 7, -13, 21, 23, 19, 31, 59
# ^ ^
swap elements at pointer
17, -10, 7, -13, 21, 23, 19, 31, 59
# ^ ^
move left pointer to first element larger than pivot. 1 compare
17, -10, 7, -13, 21, 23, 19, 31, 59
# ^^
move right pointer to first element smaller than pivot (but not past left
pointer. 1 compare
-13, -10, 7, 17, 21, 23, 19, 31, 59
#
我正在尝试在代码中实现此版本的Quicksort,但是在实现它时遇到了麻烦。下面是我拥有的代码
int partition(int arr[], int low, int high)
{
int pivot = arr[low];
int k = low;
int j = high;
for (int i = low + 1; i < high; i++)
{
if (pivot < arr[i]) // if the pivot is less than number go to left
{
for (j; j > i + 1; j--)
{
if (i >= j)
return j;
if (pivot > arr[j])
{
swap(arr[i], arr[j]); // swap the two values
}
}
}
}
return 1;
}
void quickSort(int arr[], int low, int high)
{
if (low < high)
{
int pi = partition(arr, low, high);
quickSort(arr, low, pi);
quickSort(arr, pi + 1, high);
}
}
任何帮助将不胜感激。我有点困惑。谢谢。
答案 0 :(得分:0)
很难通过示例运行来概括算法,尤其是您所展示的简单示例。您需要比示例提供的更高层次的视图,特别是对于分区功能。也许是这样的:
arr[low]
)中最左边的元素作为枢轴元素i
和j
(包括两个端点)之间的索引low + 1
和high
处找到一对元素,使得i
<j
, arr[i]
大于枢轴,而arr[j]
小于或等于枢轴;如果没有这样的配对,请停止重复i
和j
i
和j
的最终值有关。在您认为您应该认识到的事情中,步骤(2)的迭代过程不是i
的迭代-尽管它必须包含一个-因为每次迭代都只执行一次交换或停止迭代,通常,您不想为每个i
执行一次交换。
还请注意,如果您在上述过程中确实实现了(3),则枢轴的最终最终位置实际上就是其正确位置,因此在递归时可以从两个子数组中忽略它。