用递归的方式,实现分治法的顺序统计(参考课上的内容)
#include <stdio.h>
#include <stdlib.h>
void swap(int* a, int* b) {
int t = *a;
*a = *b;
*b = t;
}
int quickSelect(int arr[], int low, int high, int k) {
if (low == high) {
return arr[low];
}
int pivot = arr[high];
int i = low - 1;
for (int j = low; j < high; j++) {
if (arr[j] <= pivot) {
i++;
swap(&arr[i], &arr[j]);
}
}
swap(&arr[i + 1], &arr[high]);
int pivotIndex = i + 1;
if (k == pivotIndex) {
return arr[pivotIndex];
} else if (k < pivotIndex) {
return quickSelect(arr, low, pivotIndex - 1, k);
} else {
return quickSelect(arr, pivotIndex + 1, high, k - pivotIndex - 1);
}
}
int main() {
int arr[] = {3, 2, 1, 5, 6, 4};
int n = sizeof(arr) / sizeof(arr[0]);
int k = 3;
int kthSmallest = quickSelect(arr, 0, n - 1, k - 1);
printf("第%d小的元素是:%d\n", k, kthSmallest);
return 0;
}