题 题目一:寻找一个序列中第k大元素。对于给定的含有n元素的无序序列,求这个序列中第k(1≤k≤n)大的元素。这个题的c语言代码
时间: 2024-09-28 19:07:36 浏览: 83
题目一描述的是经典的“快速选择”(QuickSelect)算法或“Kth Largest Element in Unsorted Array”的问题。这是一个优化版的快速排序,目标是在最坏情况下的时间复杂度是O(n)找到第k个最大的元素,而不是通常快速排序的平均O(n log n)。
以下是简单的C语言代码实现快速选择的基本思路:
```c
#include <stdio.h>
#include <stdlib.h>
// 交换数组中的两个元素
void swap(int* a, int* b) {
int temp = *a;
*a = *b;
*b = temp;
}
// partition 函数返回pivot所在的新位置,使得左边元素都小于等于pivot,右边元素都大于pivot
int partition(int arr[], int low, int high, int pivot_index) {
int pivot = arr[pivot_index];
swap(&arr[pivot_index], &arr[high]);
int i = (low - 1);
for (int j = low; j <= high - 1; j++) {
if (arr[j] >= pivot) {
i++;
swap(&arr[i], &arr[j]);
}
}
swap(&arr[i + 1], &arr[high]);
return (i + 1);
}
// quick_select 选择第k个最大值
int quick_select(int arr[], int low, int high, int k) {
if (low == high) { // 如果只有一个元素,那就是第1大的
return arr[low];
}
int pivot_index = partition(arr, low, high, low); // 使用第一个元素作为枢轴
if (k == pivot_index) {
return arr[k]; // 第k大元素就是当前枢轴
} else if (k < pivot_index) {
return quick_select(arr, low, pivot_index - 1, k);
} else {
return quick_select(arr, pivot_index + 1, high, k);
}
}
int main() {
int arr[] = {3, 5, 8, 4, 9, 6};
int n = sizeof(arr) / sizeof(arr[0]);
int k = 3; // 求第3大元素
printf("The %dth largest element is: %d\n", k, quick_select(arr, 0, n - 1, k));
return 0;
}
```
阅读全文