期望为线性时间的选择算法

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

void swap(int *x, int *y) {
    int t = *x;
    *x = *y;
    *y = t;
}

int partition(int arr[], int p, int q) {
    swap(arr + (rand() % (q - p + 1)) + p, arr + q);
    int i = p;
    for (int j = p; j < q; j++) {
        if (arr[j] < arr[q]) {
            swap(arr + i++, arr + j);
        }
    }
    swap(arr + q, arr + i);
    return i;
}

int select(int arr[], int p, int q, int n) {
    int r;
    if (p >= q) {
        r = arr[p];
    } else {
        int m = partition(arr, p, q), k = m - p + 1;
        if (n == k) {
            r = arr[m];
        } else if (n < k) {
            r = select(arr, p, m - 1, n);
        } else {
            r = select(arr, m + 1, q, n - k);
        }
    }
    return r;
}

int main() {
    int arr[] = {5, 1, 20, 4, 99}, size = sizeof(arr) / sizeof(int);
    printf("%d", select(arr, 0, size - 1, 3));
    return 0;
}

 

posted @ 2022-07-04 00:05  张时雨  阅读(44)  评论(0)    收藏  举报