It is normal for Mac OS X. It used to be normal on almost all Unix-oid systems. It runs as root without sudo because the ps binary is set-uid to run as root (e.g. on my 10.4 system):
% ls -l $(which ps)
-rwsr-xr-x 1 root wheel 31932 Mar 20 2005 /bin/ps
s in place of the the user-owner
x column means that it is set-uid (and user-executable), the owner is root; this means that no matter who runs it, it will run as root)
Traditionally (and still the case on Mac OS X systems), it must run as root because the information it needs is only available via root-accessible devices (e.g. /dev/kmem) or root-only system calls. This is OK because (unless there are bugs in the implementation) the ps program is written in a way that does not let callers get information that they should not otherwise have.
Other systems have other mechanisms that provide access to the info that ps needs and thus do not need set-uid ps binaries. Notably, the /proc virtual filesystem on Linux systems (and others) can publish very fine grained kernel information with equally fine grained permissions. Such a model is sufficient to allow a non-privileged ps to get everything it needs without allowing access to the more sensitive bits of kernel information.