我基本上必须编写一个函数,它接受一个数组,一个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.
答案 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”将再次返回数组中的单个数字,如预期的那样。现在再考虑一下你的例子,看看你是否能更好地理解它。祝你好运!