本关任务:对于给定的 n 个元素的数组a[0:n-1],要求用快速排序法从中找出第 k 小的元素。用c语言写出代码
时间: 2024-06-13 07:04:21 浏览: 171
快速排序法是一种常用的排序算法,其基本思想是通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,然后再按此方法对这两部分记录分别进行快速排序,以达到整个序列有序的目的。在找出第 k 小的元素时,我们可以利用快速排序的思想,每次选取一个基准元素,将小于基准元素的放在左边,大于基准元素的放在右边,然后判断基准元素的位置与 k 的大小关系,如果基准元素的位置小于 k,则在右边继续查找,否则在左边继续查找,直到找到第 k 小的元素为止。
下面是用 C 语言实现的代码:
<<快速排序法找第 k 小的元素>>
```c
#include <stdio.h>
int Partition(int *arr, int left, int right) {
int pivot = arr[left];
while (left < right) {
while (left < right && arr[right] >= pivot) right--;
arr[left] = arr[right];
while (left < right && arr[left] <= pivot) left++;
arr[right] = arr[left];
}
arr[left] = pivot;
return left;
}
int QuickSelect(int *arr, int left, int right, int k) {
if (left == right) return arr[left];
int pivotIndex = Partition(arr, left, right);
if (k == pivotIndex) return arr[k];
else if (k < pivotIndex) return QuickSelect(arr, left, pivotIndex - 1, k);
else return QuickSelect(arr, pivotIndex + 1, right, k);
}
int main() {
int n, k, i;
scanf("%d%d", &n, &k);
int arr[n];
for (i = 0; i < n; i++) scanf("%d", &arr[i]);
int res = QuickSelect(arr, 0, n - 1, k - 1);
printf("第%d小的元素是%d", k, res);
return 0;
}
```
阅读全文