有人可以解释这个“未排序数组中的第k个最小整数”代码吗? - C

时间:2014-06-01 08:02:31

标签: c arrays algorithm sorting element

我基本上必须编写一个函数,它接受一个数组,一个int n表示数组中的元素,int k是数组中第k个最小的int(不是第k个最小位置)。不允许修改(排序)数组。我花了一段时间试图了解这个解决方案,但我一直在困惑。

有人可以尝试向我解释一下吗?谢谢!

int
kth_smallest(int A[], int n, int k) {
    int i, j;
    int smaller, equal;

    for (i = 0; i < n; i++) {
        smaller = 0;
        equal = 0;
        for (j = 0; j < n; j++) {
            smaller += (A[j] < A[i]);
            equal += (A[j] == A[i]);
        }
        if (smaller <= k && k < smaller + equal) {
            return A[i];
        }
    }
    printf("No %d'th smallest possible in array of %d items\n", k, n);
    exit(EXIT_FAILURE);
}

这是我为某些测试数据计算的逐步解决方案。

A[4] = {1,1,4,3} | n = 4 | k = 3 | Expected outcome = 4

    Loop 1 (A[i] = 1) :
    smaller = 0.
    equal   = 2.

    test: smaller <= k && k < smaller+equal | 0 <= 3 && 3 < 2 | FALSE

    Loop 2 (A[i] = 1):
    smaller = 0.
    equal   = 2.

    test: smaller <= k && k < smaller+equal | 0 <= 3 && 3 < 2 | FALSE

    Loop 3 (A[i] = 4):
    smaller = 3.
    equal   = 1.

    test: smaller <= k && k < smaller+equal | 3 <= 3 && 3 < 4 | TRUE

    RETURN A[i] (=4). (Which matches expected)

    Third smallest int in A is 4, with 1 and 3 before it.

1 个答案:

答案 0 :(得分:3)

提示:在理解这些算法时,首先考虑基本(和角落)情况通常很有帮助。首先假设数组中的所有元素都是不同的。然后,当你到达'if'子句时,'small'=小于当前被检查元素(A [i])的元素数量和'equal'= 1.因此'if'子句变为:

if (smaller <= k && k < smaller + 1)

这必然意味着

smaller = k

所以通过返回A [i],你返回的元素在数组中有(k-1)个较小的元素(因为'k'是一个从0开始的索引),即第k个最小的元素,正如预期的那样。现在看一下所有元素都相等的例子。小= 0且等于= n(总是)。因此,0..n-1范围内的任何“k”将再次返回数组中的单个数字,如预期的那样。现在再考虑一下你的例子,看看你是否能更好地理解它。祝你好运!