You can't ever sort in less than O(N), because you have to look at all N elements to determine that the list is sorted - so that's O(N) right there. You also can't sort faster than O(NlogN) if you sort by comparing against other elements in your list - but if you know something about your data, you can. If for example, you know that your data is English strings, you might be able to put them into buckets before sorting. e.g. put all strings starting with A into one bucket, with B into another, and so forth. This will be fast. You might need to make each bucket fairly large though - perhaps large enough to fit 1000 strings, since not all buckets will contain the same number of strings.
Then sort the individual buckets, which will be fast.
For a uniform distribution of data (i.e. 400 strings starting with each letter, which of course you won't have), I would guestimate that this would be O(N) + O(Nlog N/M), where M is the number of buckets.
You can obviously have nested buckets for the second letter, but the more buckets you have, the bigger your space requirements, since having to expand buckets on the fly will cost you execution time, so you want to make them sufficiently large to start with. This implies that many of them will be quite a bit bigger than they need to be, as you don't know everything about the distribution of your data.
Library sort might be worth looking at as well.