Решение аналогично быстрой сортировке за один проход.
Быстрая сортировка псевдокода:
1. Check stopping condition
2. Pick one number called pivot
3. Move smaller or equal elements than pivot on left part of array
4. Move greater elements than pivot on right part of array
5. Quicksort left part
6. Quicksort right part
Там, где вы ищите душу, то же самое, что и quicsort, кроме 1,5,6
1. Pick one number called pivot
2. Move smaller or equal elements than pivot on left part of array
3. Move greater elements than pivot on right part of array