В настоящее время я изучаю алгоритмы в свободное время, но у меня есть следующий вопрос при изучении алгоритмов select() главы 3.
Я понимаю, что могу использовать алгоритм select() для нахождения срединного числа (n/2-го наименьшего числа), если бы использовал массив от A до n чисел.
1), но это то, что я изо всех сил пытаюсь понять. А = [3, 7, 5, 1, 4, 2, 6, 2]. предположим, что это массив. что такое содержимое массива после каждого вызова Partition() и параметры при каждом рекурсивном вызове Select().
может ли кто-нибудь объяснить, как они это делают?
ниже приведен псевдокод для двух алгоритмов.
Select(A, p, r, k) {
/* return k-th smallest number in A[p..r] */
if (p==r) return A[p] /* base case */
q := Partition(A,p,r)
len := q – p + 1
if (k == len) return A[q]
else if (k<len) return Select(A,p,q-1,k)
else return Select(A,q+1,r,k-len)
}
и второй код
Partition(A, p, r) { /* partition A[p..r] */
x := A[r] /* pivot */
i := p-1
for j := p to r-1 {
if (A[j] <= x) {
i++
swap(A[i], A[j])
}
}
swap(A[i+1], A[r])
return i+1
}
Книга, которую я использую, называется The Derivation of Algorithms Анны Калдевайдж.