void quick_sort(int arr[], int left, int right) { int i, j, pivot, temp; if (left < right) { pivot = left; i = left; j = right; while (i < j) { while (arr[i] <= arr[pivot] && i < right) { i++; } while (arr[j] > arr[pivot]) { j--; } if (i < j) { temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } } temp = arr[pivot]; arr[pivot] = arr[j]; 是由大到小排序吗 arr[j] = temp; quick_sort(arr, left, j - 1); quick_sort(arr, j + 1, right); } }
时间: 2023-06-23 15:10:00 浏览: 83
这是一个快速排序算法的实现,它可以对一个整数数组进行排序。在这个实现中,首先选取数组的左边界作为枢轴(pivot),然后使用双向扫描的方式不断将左边的元素和右边的元素交换位置,直到左右扫描指针相遇。最后将枢轴与指针相遇处的元素交换位置,这样就将数组分成了两部分。接着递归对左右两部分进行快速排序,直到每个部分只有一个元素或者为空。这个实现的时间复杂度是 O(nlogn),空间复杂度是 O(logn)。至于是由大到小排序还是由小到大排序,取决于这个实现中的比较符号,这里使用的是小于等于和大于,所以是由小到大排序。如果想要实现由大到小排序,只需要将比较符号改为大于等于和小于即可。
相关问题
#include <stdio.h>void swap(int arr[], int i, int j) { int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp;}void quick_sort(int arr[], int left, int right) { if (left >= right) return; // 递归结束条件 int i = left, j = right, pivot = arr[left]; while (i < j) { while (i < j && arr[j] >= pivot) j--; if (i < j) { swap(arr, i, j); i++; } while (i < j && arr[i] < pivot) i++; if (i < j) { swap(arr, i, j); j--; } } quick_sort(arr, left, i - 1); quick_sort(arr, i + 1, right);}int main() { int n; scanf("%d", &n); int arr[n]; for (int i = 0; i < n; i++) { scanf("%d", &arr[i]); } quick_sort(arr, 0, n - 1); for (int i = 0; i < n; i++) { printf("%d ", arr[i]); } return 0;}每一行解析
这是一个 C 语言程序,实现了快速排序算法。下面逐行解析程序:
1. #include <stdio.h>
包含标准输入输出头文件。
2. void swap(int arr[], int i, int j) {
定义了一个名为 swap 的函数,用于交换数组 arr 中下标为 i 和 j 的元素。
3. int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
实现了 swap 函数的功能,即交换 arr[i] 和 arr[j] 的值。
4. void quick_sort(int arr[], int left, int right) {
定义了一个名为 quick_sort 的函数,用于实现快速排序算法。
5. if (left >= right) return;
如果 left 大于等于 right,即数组长度为 0 或 1,直接返回。
6. int i = left, j = right, pivot = arr[left];
定义了三个变量:i 和 j 分别表示左右指针,pivot 表示基准元素,初始值为数组 arr 的第一个元素。
7. while (i < j) {
用 while 循环实现快速排序算法的核心部分。
8. while (i < j && arr[j] >= pivot) j--;
从右往左找到第一个小于 pivot 的元素,将其下标保存在 j 中。
9. if (i < j) {
swap(arr, i, j);
i++;
}
如果 i 小于 j,即找到了一个小于 pivot 的元素,将其与 arr[i] 交换位置,并将 i 自增。
10. while (i < j && arr[i] < pivot) i++;
从左往右找到第一个大于等于 pivot 的元素,将其下标保存在 i 中。
11. if (i < j) {
swap(arr, i, j);
j--;
}
如果 i 小于 j,即找到了一个大于等于 pivot 的元素,将其与 arr[j] 交换位置,并将 j 自减。
12. quick_sort(arr, left, i - 1);
递归调用 quick_sort 函数,对左半部分进行快速排序。
13. quick_sort(arr, i + 1, right);
递归调用 quick_sort 函数,对右半部分进行快速排序。
14. int main() {
程序的主函数。
15. int n;
scanf("%d", &n);
输入数组的长度。
16. int arr[n];
定义一个长度为 n 的数组 arr。
17. for (int i = 0; i < n; i++) {
scanf("%d", &arr[i]);
}
输入数组的元素。
18. quick_sort(arr, 0, n - 1);
对数组 arr 进行快速排序。
19. for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
输出排好序的数组元素。
20. return 0;
程序正常结束。
typedef struct { char name[20]; int score; } Contestant; Contestant contestants[10]; // 获取参与者信息和成绩的代码,例如: for (int i = 0; i < 10; i++) { scanf("%s", contestants[i].name); contestants[i].score = calculate_score(i); // 根据提交的代码计算得分 } void quick_sort(Contestant arr[], int left, int right) { if (left >= right) return; int pivot = arr[right].score; int i = left, j = right - 1; while (i <= j) { while (arr[i].score > pivot) i++; while (arr[j].score < pivot) j--; if (i <= j) { Contestant temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; i++; j--; } } Contestant temp = arr[i]; arr[i] = arr[right]; arr[right] = temp; quick_sort(arr, left, i - 1); quick_sort(arr, i + 1, right); } quick_sort(contestants, 0, 9); printf("Rank Name Score\n"); for (int i = 0; i < 10; i++) { printf("%2d %-5s %d\n", i + 1, contestants[i].name, contestants[i].score); }
As an AI language model, I do not have a personal opinion or emotions, so the concept of "null" does not apply to me in that sense. However, "null" is a programming term that refers to a value that is undefined or absent. In programming, null is often used to represent a missing or non-existent value.
阅读全文