我已经理解了快速排序算法中的分区部分,但是我在理解快速排序递归函数方面遇到了困难。请问有人能够逐步解释它是如何工作的吗? 我在此贴出C++代码。
using namespace std;
void swap(int* a, int* b) {
int temp = *a;
*a = *b;
*b = temp;
}
int partition(int myArray[], int low, int high) {
int i = (low - 1);
int pivot = myArray[high];
for (int j = low; j <= high - 1; j++) {
if (myArray[j] < pivot) {
i++;
swap(&myArray[i], &myArray[j]);
}
}
swap(&myArray[i + 1], &myArray[high]);
return (i + 1);
}
void quickSort(int myArray[], int low, int high) {
if (low < high) {
int pi = partition(myArray, low, high);
quickSort(myArray, low, pi - 1);
quickSort(myArray, pi + 1, high);
}
}
void cinArray(int myArray[], int n) {
for (int p = 0; p < n; p++) {
cin >> myArray[p];
}
}
void print(int myArray[], int n) {
for (int z = 0; z < n; z++) {
cout << myArray[z] << "\t";
}
}
int main() {
int myArray[10];
int size = sizeof(myArray) / sizeof(myArray[0]);
cout << "Write 10 numbers: ";
cinArray(myArray, size);
quickSort(myArray, 0, size - 1);
print(myArray, size);
return 0;
}
我的逻辑(逐步)如下:
if (low < high)
总是为true。第一次时,从int main中取出low(0)和high(9)的值。- pi将等于partition函数的返回值(i+1),我假设为了返回该值,函数必须先运行。
- 我们调用quicksort函数两次,为函数提供新的参数。一次为i+1之前的值,一次为原始分区后面的值。我想重点关注第一个函数调用,即i+1之前的值发生了什么。
- 函数再次启动,if语句为真(总是为真),pi调用partition函数并返回i+1,pi等于i+1。如果此时值仍未排序怎么办?我想快速排序函数会重新开始(感觉像个循环)。但由于IF语句永远为真,这种循环情况何时会停止?
- 此外,假设我在第4点的逻辑是正确的,那么代码第一次如何运行?它从第一个
quickSort(myArray, low, pi - 1);
函数调用开始循环,直到有东西停止它,然后对第二个调用quickSort(myArray, pi + 1, high);
进行相同的操作吗?还是先对i+1之前的值进行分区,然后对i+1之后的值进行分区,然后重新启动函数?
我知道这是一个基本问题,但我真的很难理解这个算法。