https://en.wikipedia.org/wiki/I/O_scheduling
Basically, an I/O scheduler determines the order in which things get written to or read from storage. It will prioritize each block of data based on which process is requesting the operation or how much time it takes to complete each operation. If you want to know exactly how each scheduler prioritizes things, you're probably better off searching Google for in-depth explanations.
As for which one is best, in my opinion the best to use, if available, are BFQ, SIO, or V(R) in no particular order. BFQ is made for desktop computer use and responsiveness. The other two were both made for mobile devices with solid state storage and should both perform well. CFQ is the standard Linux scheduler. It's best for servers or similar setups. Noop doesn't prioritize anything. It's FIFO (first in, first out), so operations are performed in the order they're received. I don't personally recommend it for any reason.
And before anyone jumps in with benchmark scores, I should say that benchmarks are a terrible way to determine which setup is best for everyday use. For example, BFQ does terribly in benchmarks because it's optimized for desktop use. You would notice the benefits of BFQ, for example, if you were listening to music or watching a video while copying a large file. If you were using CFQ or noop, the music may skip as it switches between the file operations and reading the music, but BFQ would prioritize the media more highly, and the music would play through. I don't know much about SIO or V(R), but since they were made for our devices, they should perform well.
Just try them each for a few days to see which performs best for your everyday use.