我想知道是否有人可以帮我快速排序。我理解分区的一般想法,但不确定为什么它会返回索引
int partition(int arr[], int left, int right)
{
int i = left, j = right;
int tmp;
int pivot = arr[(left + right) / 2];
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--;
}
}
return i;
}
void quickSort(int arr[], int left, int right) {
int index = partition(arr, left, right);
if (left < index - 1)
quickSort(arr, left, index - 1);
if (index < right)
quickSort(arr, index, right);
}
我理解整个重新排列的部分。这对我来说很有意义,但我不确定为什么分区只返回一个索引。我以为它应该返回一个阵列?就像问题是......排序{1,12,5,26,7,14,3,7,2}。我以为会回来......
1,2,5,7,3,14,7,26,12
我猜这就是为什么我不了解实际的快速排序功能。但如果有人能够以一种易于理解的方式帮助解释清楚,那将非常感激。非常感谢!
答案 0 :(得分:2)
返回的索引仅用于识别QuickSort算法中的recurrsion结束。它主要是用于识别越来越小的数字的枢轴元素的索引。
AND:您指的是增强的快速搜索算法。在QuickSearch算法的基本版本中,不需要返回的索引。
它也适用于:(但速度慢很多)
void quickSort(int arr[], int left, int right)
{
if (left < right)
{
int index = partition(arr, left, right);
quickSort(arr, left, index - 1);
quickSort(arr, index+1, right);
}
}
答案 1 :(得分:1)
您的分区功能正在就地修改阵列。它返回的整数是一个索引,在该索引之前,值小于pivot,并且从值开始大于pivot。两个递归调用是对较小元素和较大元素进行排序;在递归调用之前测试的条件作为基本情况。