快速排序【】C语言完整代码及其设计思路
时间: 2023-07-24 12:51:42 浏览: 45
好的,以下是快速排序的C语言完整代码及其设计思路:
### 设计思路
快速排序的基本思想是通过一趟排序将待排序序列分成两部分,其中一部分的所有元素均比另一部分的所有元素小,然后再对这两部分分别进行快速排序,最终整个序列有序。
具体实现时,我们选择一个基准元素(通常为待排序序列的第一个元素),将序列中所有比它小的元素放在它的左边,所有比它大的元素放在它的右边,然后分别对左右两部分递归地进行快速排序,直到整个序列有序为止。
### C语言代码
```c
#include <stdio.h>
void quicksort(int arr[], int left, int right) {
int i, j, pivot, tmp;
if (left < right) {
i = left;
j = right;
pivot = arr[left];
while (i < j) {
while (i < j && arr[j] >= pivot) {
j--;
}
if (i < j) {
arr[i] = arr[j];
i++;
}
while (i < j && arr[i] <= pivot) {
i++;
}
if (i < j) {
arr[j] = arr[i];
j--;
}
}
arr[i] = pivot;
quicksort(arr, left, i - 1);
quicksort(arr, i + 1, right);
}
}
int main() {
int arr[] = {9, 3, 2, 7, 1, 6, 8, 5, 4};
int len = sizeof(arr) / sizeof(arr[0]);
int i;
printf("Before sorting: ");
for (i = 0; i < len; i++) {
printf("%d ", arr[i]);
}
printf("\n");
quicksort(arr, 0, len - 1);
printf("After sorting: ");
for (i = 0; i < len; i++) {
printf("%d ", arr[i]);
}
printf("\n");
return 0;
}
```
这段代码中,我们定义了一个名为 `quicksort` 的函数,它接受三个参数:待排序的数组 `arr`,数组中待排序部分的左右边界 `left` 和 `right`。在函数中,我们首先判断左右边界是否满足 `left < right`,如果满足,则进行以下操作:
1. 初始化两个指针 `i` 和 `j`,分别指向待排序部分的左右边界;
2. 选择一个基准元素 `pivot`,通常为待排序部分的第一个元素;
3. 从右向左扫描数组,找到第一个比基准元素小的元素,将它移到基准元素的左边;
4. 从左向右扫描数组,找到第一个比基准元素大的元素,将它移到基准元素的右边;
5. 重复步骤3和4,直到 `i` 和 `j` 相遇;
6. 将基准元素移到相遇点,这样就将数组分成了两部分;
7. 分别对左右两部分递归进行快速排序。
最后,在 `main` 函数中,我们定义了一个数组 `arr`,对它进行快速排序,并输出排序前后的结果。
注意,这里我们选择了数组的第一个元素作为基准元素,实际上还可以选择其他元素,例如中间的元素、随机的元素等等,这样可以避免某些特殊情况下快速排序的性能退化。