【发布时间】:2020-03-23 13:55:09
【问题描述】:
我已经了解了快速排序算法中的分区部分是如何完成的,但是我无法理解快速排序递归函数。有人可以逐步向我解释它是如何工作的吗?我在这里粘贴 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)永远是真的。第一次, 低 (0) 和高 (9) 值取自 int main。 - Pi 将等于分区函数的返回值 (i+1),我想为了返回该值,函数 必须先运行。
- 我们调用快速排序函数两次,为函数提供新参数。一次为 来自原始分区的 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 之后分区并重新启动函数?
我知道这是一个基本问题,但我真的很难理解这个算法。
【问题讨论】:
标签: c++ algorithm sorting quicksort