二分法找数组中第K小的数

来源:互联网 发布:运动前吃什么 知乎 编辑:程序博客网 时间:2024/04/29 06:29

方法是二分法,可以说是快速排序的一个变形。


#include <stdio.h>void swap(int*a , int* b) {    int temp = *a;    *a = *b;    *b = temp;}int findkth(int arr[], int l, int h, int k) {    int x = arr[h];    int i = l-1, j;    for (j=l; j<h; j++) {        if (arr[j] <= x) {            i++;            swap(&arr[i], &arr[j]);        }    }    swap(&arr[i+1], &arr[h]);        if (i+2-l == k) { // 看下标为i+1的数是否是第k小的数        return arr[i+1];    } else if (k < i+2-l) {        return findkth(arr, l, i, k); // 搜索i+1的左边</span>    } else {        return findkth(arr, i+2, h, k+l-2-i); // 搜索i+1的右边</span>    }}int main() {    int k, knum;    k = 3;    int arr[10] = {6, 7, 4, 2, 1, 0, 9, 8, 5, 3};    knum = findkth(arr, 0, 9, 10);    printf("%d", knum);    return 0;}


0 0
原创粉丝点击