No sorting algorithm can sort performing less than Ω(n) operations,
since the algorithm has to read the input.
Here is a lowerbound using the adversary argument:
if an algorithm doesn't read a part of input then
we can change that part of the input without effecting the execution of the algorithm,
as a result we can change the answer but
the algorithm will not notice this change
since it is not reading that part.
But quicksort does not achieve this lowerbound.
No comparison based algorithm can have
worst-case (or even average-case) running time O(n).
All of them require Ω(n lg n) comparison operations.
This can be shown using a decision tree lowerbound argument.
The best case complexity of the QuickSort algorithm
(which implies that the pivot is chosen optimally)
is Ω(n lg n) as Dukeling has explained.
It is possible to modify algorithms and
hardcode the answer for a particular kind of inputs (like already sorted arrays)
more efficiently and potentially improve the best-case running time.
How efficiently depends on how fast
we can check if the input belongs to one of those special cases and
how fast we can output the answer for those special cases.
We can check if an array is already sorted and output it in linear time.
So we can improve the best-case complexity of any sorting algorithm to O(n)
by hardcoding this special case.