with a(a,b,c) as (select 111,3, null from dual union all
select null,null,777 from dual union all
select 333,1,null from dual union all
select 555,2, null from dual union all
select null,null, 333 from dual union all
select 777, 4, null from dual union all
select 888, 5, null from dual )
select a.*
from a
order by last_value(b ignore nulls) over (partition by nvl(a,c) order by b), b nulls last

output

333 1
333
555 2
111 3
777 4
777
888 5

7 rows selected

or as you say later, you can have both not null A and C columns, you can do like this:

with a(a,b,c) as (select 111,3, null from dual union all
select null,null,777 from dual union all
select 333,1,null from dual union all
select 555,2, null from dual union all
select null,null, 333 from dual union all
select 777, 4, null from dual union all
select 444,null, 333 from dual union all
select 888, 5, null from dual )
select a.*
from a
order by last_value(b ignore nulls)
over (partition by CASE when b is null then c else a end order by b), b nulls last

output

A B C
333 1
333
444 333
555 2
111 3
777 4
777
888 5
8 rows selected

Email codedump link for Order by statement - ordering by multiple columns