Use [man]usort[/man]! Then you only need to define a comparison function, instead of having to re-implement the whole search funtion.
Big-O notation refers to the complexity of the algorithm. Bubblesort, being O(n2), would require on the order of 10,000 operations to sort a list of 100 items, or 1,000,000 operations to sort a list of 1000 items. This is bad, because the complexity goes up really fast as you increase the size of the data. Note that this isn't how fast it is, or exactly how many operations it takes, but it gives a general description of how the algorithm scales.
"Real" sort algorithms (quicksort, heapsort, mergesort, maybe others) run in O(n*(log(n))) time. Those algorithms would only require on the order of 10,000 operations to sort 1000 items.
If you really want to learn a good sort algorithm, I find mergesort is easier than quicksort (don't need to choose a pivot algorithm, fewer opportunities for off-by-one errors, etc). It's not as fast as quicksort but it is still way faster than bubblesort (except on tiny amounts of data, in which case you don't really care how fast it is anyway). It is also "stable", meaning it doesn't change the order of items that compare equal (unlike quicksort and heapsort).