我正在尝试将quicksort片段应用于我的程序;然而,我发现的大量教程或例子都没有用外行的术语解释我用于第二和第三个参数,通常称为左和右;解释不够简单,让我无法理解。
Beneath是逐字摘录;如果有任何问题我道歉。
void quickSort(int arr[], int left, int right)
{
int i = left, j = right;
int tmp;
int pivot = arr[(left + right) / 2];
/* partition */
while (i <= j)
{
while (arr[i] < pivot)
i++;
while (arr[j] > pivot)
j--;
if (i <= j)
{
tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
i++;
j--;
}
};
/* recursion */
if (left < j)
quickSort(arr, left, j);
if (i < right)
quickSort(arr, i, right);
}
据我所知,第一个参数是要排序的数组,但是我为“左”和“右”传入了该数组的确切内容。
我已经编写了几年但我没有得到最好的指导,所以如果这对你有所帮助,请教育我,因为我仍处于学习阶段。
答案 0 :(得分:2)
left
和right
是要为当前调用快速排序调用而排序的数组的索引。
当您第一次在顶层调用quicksort时,left
和right
是完整的数组。例如:
int arr[] = { 3,4,6,2,5,6,6,7,4,4,6,5,3,6,7,8,8,6,4,3 };
quicksort(arr, 0, 19);
答案 1 :(得分:0)
在我回答之前有一点,
while (i <= j)
{
while (arr[i] < pivot)
i++;
while (arr[j] > pivot)
j--;
if (i <= j)
{
tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
i++;
j--;
}
};
这部分代码有一个错误缩进的while循环,所以有点令人困惑。
所以左边和右边是你所需数组的左右索引。
让我们说我们有一个阵列
[1, 4, 5, 6, 3]
快速排序的排序部分将排列数组
[1, 4, 3, 6, 5]
在您将要进行递归调用之后会发生什么
quickSort(arr, 0, 2)
quickSort(arr, 3, 4)
因此,一个quickSort将基于左(索引0)到右(索引2)对它们进行排序,另一个将快速排序基于左边(索引3)到右边(索引4),直到数组达到长度&lt; 1