我已经了解了快速排序算法中的分割部分是如何完成的,但是我很难理解快速排序递归函数。有人可以一步一步向我解释一下它是如何工作的吗?我在这里粘贴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 high) {
if (low < high) {
int pi = partition(myArray,low,high);
quickSort(myArray,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,size - 1);
print(myArray,size);
return 0;
}
到目前为止(逐步),我的逻辑是:
-
if (low < high)
将始终为真。第一次, 低(0)和高(9)值来自int main。 - Pi将等于分区函数的返回值 (i + 1),我想为了返回该值,该函数 必须先运行。
- 我们调用quicksort函数,为函数提供两次新参数。一次 原始分区中i + 1之后的值之前和之后的值。我想关注第一个发生的事情,即第一个发生在i + 1之前的值。
- 函数再次启动,如果if语句为true(总是),pi调用函数分区并返回i + 1,pi等于i + 1。如果此时仍未对值进行排序怎么办?我想quicksort函数会重新启动(感觉就像是一个循环)。但是,由于IF语句始终为true,因此这种循环情况何时停止?
- 此外,假设我在第4点的逻辑正确,那么代码如何第一次运行?它是否从第一个
quickSort(myArray,pi - 1);
函数调用开始并循环直到某些东西停止它,然后对第二个调用quickSort(myArray,high);
相同?还是在i + 1之前分区然后在i + 1之后分区并重新启动功能?
我知道这是一个基本问题,但是我真的很难理解这个算法。