首页 > 试题广场 >

下面函数实现了从一个长度为n的数组中得到第K小的数,请分析它

[单选题]

下面函数实现了从一个长度为n的正整数数组中得到第K小的数(无解返回-1),请分析它的平均时间复杂度为()


int partition(int arr[], int left, int right)
{
    int j = left, tmp;
    for (int i = left; i < right; ++i){
        if (arr[i] <= arr[right]){
            tmp = arr[i];
            arr[i] = arr[j];
            arr[j] = tmp;

            j += 1;
        }
    }
    tmp = arr[j];
    arr[j] = arr[right];
    arr[right] = tmp;
    return j;
}

int find_kth(int arr[], int n, int K)
{
    int left = 0, right = n - 1;
    K -= 1;
    while (true){
        int pivot = partition(arr, left, right);
        if (pivot == K)
            return arr[pivot];
        if (pivot > K)
            right = pivot - 1;
        else
            left = pivot + 1;
    }
    return -1;
}


  • O(NlogK)
  • O(K*logN)
  • O(N*logN)
  • O(N)
该算法是利用快排的思想,但是只对划分出的两组中的一个(第K小的数所在的组)进行递归,所以时间复杂度为O(N)。
发表于 2022-03-11 19:23:20 回复(0)
这题不应该是nlogn吗,外层算法和折半查找的复杂度应该是一样的,而折半查找的复杂度就是logn,总共有n个元素,每次查找的区间大小就是n,n/2,n/4,…,n/2^k(接下来操作元素的剩余个数),其中k就是循环的次数。
由于n/2^k取整后>=1,即令n/2^k=1,
可得k=log2n,(是以2为底,n的对数),所以时间复杂度就是O(logn)
发表于 2024-04-24 15:04:29 回复(0)