下面的代码是寻找数组a[]中第k个元素,其中隐含着错误。
- template <class Type>
- int partition(Type a[], int p, int r)
- {
- int i = p - 1;
- int j = p;
- Type t = a[r];
- Type temp;
- for (; j < r; ++j)
- {
- if (a[j] <= t)
- {
- ++i;
- temp = a[i];
- a[i] = a[j];
- a[j] = temp;
- }
- }
- temp = a[i + 1];
- a[i + 1] = a[r];
- a[r] = temp;
- return i + 1;
- }
- template <class Type>
- Type findK(Type a[], int p, int r, int k)
- {
- if (p == r)
- {
- return a[p];
- }
- int i = partition(a, p, r);
- int j = i - p + 1;
- if (k <= j)
- return findK(a, p, i, k);
- else
- return findK(a, i + 1, r, k - j);
- }
错误1:可能会出现的死循环,上述的分区算法在快排中可以正常使用,但在中位数算法中就必须做出修改。