#include <stdio.h>
void swap(int* a, int* b) {
int t = *a;
*a = *b;
*b = t;
}
int partition(int arr[], int low, int high) {
int pivot = 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);
}
int quickSelect(int arr[], int low, int high, int k) {
if (low <= high) {
int pivotIndex = partition(arr, low, high);
if (pivotIndex == k - 1)
return arr[pivotIndex];
else if (pivotIndex > k - 1)
return quickSelect(arr, low, pivotIndex - 1, k);
else
return quickSelect(arr, pivotIndex + 1, high, k);
}
return -1;
}
int findKthLargest(int arr[], int size, int k) {
return quickSelect(arr, 0, size - 1, k);
}
int main() {
int arr1[] = { 3, 2, 1, 5, 6, 4 };
int n1 = sizeof(arr1) / sizeof(arr1[0]);
int k1 = 1;
int kthLargest1 = findKthLargest(arr1, n1, k1);
printf("第 %d大的数是: %d\n", k1, kthLargest1);
int arr2[] = {8,2,5,23,11,21,7 };
int n2 = sizeof(arr2) / sizeof(arr2[0]);
int k2 = 2;
int kthLargest2 = findKthLargest(arr2, n2, k2);
printf("第 %d大的数是: %d\n", k2, kthLargest2);
int arr3[] = { 5,7,1,12,31,11 };
int n3 = sizeof(arr3) / sizeof(arr3[0]);
int k3 = 3;
int kthLargest3 = findKthLargest(arr3, n3, k3);
printf("第 %d大的数是: %d\n", k3, kthLargest3);
return 0;
}