void quickSort(int arr[], int left, int right){ //arr是数组,left是起始下标,right是结束下标 if(left >= right)return; int base =arr[left],l = left,r = right; while (l < r){ while (l < r && arr[r] >= base) r--; arr[l] = arr[r]; while (l< r && arr[r] <= base)l++; arr[r] = arr[l]; } arr[r] = base; quickSort(arr,left,r-1); quickSort(arr,r+1,right); } int main() { int arr[] = {4, 3, 8, 2, 1, 7, 5, 6, 9, 0}; quickSort(arr, 0, 9); //10个数字下标就是0-9 for (int i = 0; i < 10; ++i) { printf("%d ", arr[i]); } }
时间: 2024-01-23 09:02:23 浏览: 66
这段代码虽然没有明显的语法错误,但是存在两个潜在的问题:
1. 在 while 循环中,第二个 while 的判断条件应该是 `arr[l] <= base` 而不是 `arr[r] <= base`。因为此时基准元素已经被保存在 `arr[left]` 的位置上,所以需要从左侧开始扫描,找到第一个比基准元素大的元素进行交换。
2. 在递归调用 quickSort 函数时,应该先对左边的子数组进行排序,再对右边的子数组进行排序。因为在递归调用的过程中,左侧的子数组长度可能会先达到 0 或 1,从而停止递归,而右侧的子数组仍然需要继续排序。
改正后的代码如下:
```
void quickSort(int arr[], int left, int right) {
if (left >= right) return;
int base = arr[left], l = left, r = right;
while (l < r) {
while (l < r && arr[r] >= base) r--;
arr[l] = arr[r];
while (l < r && arr[l] <= base) l++;
arr[r] = arr[l];
}
arr[l] = base; // 将基准元素归位
quickSort(arr, left, l - 1); // 对左侧子数组进行排序
quickSort(arr, l + 1, right); // 对右侧子数组进行排序
}
int main() {
int arr[] = {4, 3, 8, 2, 1, 7, 5, 6, 9, 0};
quickSort(arr, 0, 9); // 10个数字下标就是0-9
for (int i = 0; i < 10; ++i) {
printf("%d ", arr[i]);
}
}
```
阅读全文