#include <stdio.h>
#include <math.h>
int findKthLargest(int arr[], int low, int high, int K) {
if (low < high) {
int pivotIndex = partition(arr, low, high);
int p = pivotIndex - low + 1;
if (p == K) {
return arr[pivotIndex];
} else if (p < K) {
return findKthLargest(arr, pivotIndex + 1, high, K - p);
} else {
return findKthLargest(arr, low, pivotIndex - 1, K);
}
}
return arr[low];
}
void printArray(int array[], int arrLen) {
for (int i = 0; i < arrLen; ++i) {
printf("%d ",array[i]);
}
}
void printArray1(int array[], int arrStart, int arrEnd) {
for (int i = arrStart; i < arrEnd; ++i) {
printf("%d ",array[i]);
}
printf("\n");
}
int findMark(int array[],int arrStart,int arrEnd){
int p = arrEnd - 1;
return p;
}
int partition(int array[],int arrStart,int arrEnd,int mark){
int arrayLen = arrEnd - arrStart;
if(arrayLen < 1 || mark <arrStart || mark >= arrEnd){
return -1;
}
int markValue = array[mark];
array[mark] = array[arrEnd - 1];
int j = 0;
for(int i = arrStart;i<arrEnd-1;++i){
if(array[i]<=markValue){
int temp = array[arrStart+j];
array[arrStart+j] = array[i];
array[i] = temp;
++j;
}
}
array[arrEnd - 1] = array[arrStart + j];
array[arrStart+j]=markValue;
return arrStart+j;
}
_Bool quickSort(int array[],int arrStart,int arrEnd){
int arrLen = arrEnd - arrStart;
if(arrLen < 0){
return 0;
}
if(arrLen == 1 || arrLen == 0){
return 1;
}
int mark = findMark(array,arrStart,arrEnd);
int orderedMark = partition(array,arrStart,arrEnd,mark);
printArray1(array, arrStart, orderedMark);
printArray1(array, orderedMark, arrEnd);
quickSort(array,arrStart,orderedMark);
quickSort(array,orderedMark,arrEnd);
return 1;
}
int main () {
int array0[] = {};
int arrayLen = sizeof(array0)/sizeof(int);
int array1[] = {9, 12, 8, 7, 3};
arrayLen = sizeof(array1)/sizeof(int);
printf("排序前:");
printArray(array1, arrayLen);
printf("\n=======快速排序过程================");
quickSort(array1, 0, arrayLen);
printf("============END================\n");
printf("排序后:");
printArray(array1, arrayLen);
printf("\n====================================");
int K = 3;
int result = findKthLargest(array1, 0, arrayLen - 1, K);
printf("\n第%d小的元素是: %d", K, result);
return 0 ;
}