#include <stdio.h>
#include <stdlib.h>

int partition(int* arr, int low, int high) 
{
    if (low >= high) {
        return -1;
    }

    int i = low;
    int j = high;
    int pivot = arr[low];

    while(i < j) {
        while(i < j && arr[j] >= pivot) {
            j--;
        }

        if (i < j) {
            arr[i++] = arr[j];
        }

        while (i < j && arr[i] < pivot) {
            i++;
        }

        if (i < j)
        {
            arr[j--] = arr[i];
        }
    }

    arr[i] = pivot;

    return i;
}

int kthSmallest(int* arr, int low, int high, int k) 
{    
    while(1) {
        int position = partition(arr, low, high);

        int index = k - 1;

        if (position == index) {
            return arr[position];
        } else if (position > k) {
            high = position - 1;
        } else {
            low = position + 1;
        }
    }
}

int main(int argc, char const *argv[])
{
    int arr[] = {23, 322, 1, 54, 86, 2, 90, 102, 66, 233, 6, 98};

    int length = sizeof(arr) / sizeof(int);

    int k = 3;

    printf("K-th smallest element is %d\n", kthSmallest(arr, 0, length - 1, k));

    return 0;
}


洛奇_巴布亚
23 声望2 粉丝

« 上一篇
快速排序
下一篇 »
冒泡排序