编辑代码

#include <stdio.h>
#include<stdbool.h>

// 交换数组中两个元素的值
void swap(int* a, int* b) {
    int temp = *a;
    *a = *b;
    *b = temp;
}

// 打印数组内容
void printArray(int arr[], int size) {
    for (int i = 0; i < size; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");
}

// 分区函数,将数组划分为左边小于基准元素,右边大于基准元素
int partition(int arr[], int low, int high) {
    int pivot = arr[low];  // 选择第一个元素作为基准元素
    int i = low + 1;      // 左指针
    int j = high;         // 右指针

    while (1) {
        // 左指针向右移动,直到找到大于基准元素的位置
        while (arr[i] < pivot && i <= high) {
            i++;
        }

        // 右指针向左移动,直到找到小于基准元素的位置
        while (arr[j] > pivot && j >= low + 1) {
            j--;
        }

        if (i >= j) {
            break;
        }

        // 交换左指针和右指针所指向的元素
        swap(&arr[i], &arr[j]);
        printArray(arr, high + 1);  // 打印每一步的数组状态
    }

    // 将基准元素放到正确的位置上
    swap(&arr[low], &arr[j]);
    printArray(arr, high + 1);  // 打印每一步的数组状态

    return j;  // 返回基准元素的位置
}

// 快速排序函数
void quickSort(int arr[], int low, int high) {
    if (low < high) {
        int pivot_index = partition(arr, low, high);  // 获取分区点
        quickSort(arr, low, pivot_index - 1);         // 对左子数组递归排序
        quickSort(arr, pivot_index + 1, high);        // 对右子数组递归排序
    }
}


int findPivotPos(int array[],int arrStart,int arrEnd){
    int arrLen=arrEnd-arrStart;
    int mid=arrStart+arrLen/2;
    int min=arrStart;
    int max=arrEnd-1;
    if(array[min]>array[mid]){
        int temp=min;
        min=mid;
        mid=temp;
    }
    if(array[mid]>array[max]){
        int temp=mid;
        mid=max;
        max=mid;
    }
    if(array[min]>array[mid]){
        int temp=min;
        min=mid;
        mid=temp;
    }
    return mid;
}

//查找无序数组中的第k大元素
bool findKthValue(int array[],int arrStart,int arrEnd,int k){
    int arrLen=arrEnd-arrStart;
    if(arrLen<0 || k<arrStart || k>=arrEnd){
        printf("Please check your input");
        return false;
    }
    if(arrLen==1 && arrStart == k){
        return true;
    }

    int pivotPos=findPivotPos(array,arrStart,arrEnd);
    int pivotOrderedPos=partition(array,arrStart,arrEnd);
    if(k==pivotOrderedPos){
        return true;
    }
    bool ret=false;
    if(k<pivotOrderedPos){
        ret=findKthValue(array,arrStart,pivotOrderedPos,k);
    }else{
        ret=findKthValue(array,pivotOrderedPos+1,arrEnd,k);
    }
    return ret;
}

int main () {
    int arr[] = {10, 7, 8, 9, 1, 5};
    findKthValue(arr,0,5,3);
    return 0;
}