You need a really UGLY order by statement. Something like this should work for your sample above (column name is a):
SELECT *
FROM (
VALUES ('1'), ('2'), ('3'), ('8'), ('9'), ('10'), ('3A'), ('1B')
) AS X(a)
ORDER BY
Cast(Reverse(substring(Reverse(rtrim(ltrim( substring(a , patindex('%[0-9]%', a ) , len(a) )))) , patindex('%[0-9]%', Reverse(rtrim(ltrim( substring(a , patindex('%[0-9]%', a) , len(a) )))) ), len(Reverse(rtrim(ltrim( substring(a , patindex('%[0-9]%', a) , len(a) ))))) )) as Int)
, SUBSTRING(a, Len(Reverse(substring(Reverse(rtrim(ltrim( substring(a , patindex('%[0-9]%', a ) , len(a) )))) , patindex('%[0-9]%', Reverse(rtrim(ltrim( substring(a , patindex('%[0-9]%',a) , len(a) )))) ), len(Reverse(rtrim(ltrim( substring(a , patindex('%[0-9]%', a) , len(a) ))))) ))) + 1 , 9999)