Sólo quería hacer un pequeño inciso con respecto a lo que comenta Marchi:
Si los vectores a ordenar son de tamaños pequeños (no más de unos 20 ó 30 elementos) es mejor utilizar un algoritmo de ordenación directo (inserción, selección, burbuja, etc...), ya que éstos, a pesar de tener cotas O(n^2), responden mejor que los rápidos (QuickSort, MergeSort, HeapSort, etc...), con costes de O(n*log n), y O(n^2) para el caso de QuickSort, en caso de una mala elección del pivote o simplemente el caso de que el vector ya está ordenado (caso peor).Cita:
Siguiendo tu idea podrias cambiar bubble sort por quick sort o merge sort, que son bastante mas eficientes.
La razón por la que los directos son mejores en casos de vectores pequeños, es debida normalmente a las constantes multiplicativas. Hasta cierto umbral, la función T1(n)=k1*n^2 es más pequeña que T2(n)=k2*n*log n. A partir de dicho valor, las funciones se cortan y ya es más eficiente utilizar un algoritmo de ordenación rápido que uno directo. Empíricamente se puede observar que los algoritmos recursivos suelen ser más costosos que los iterativos puesto que en cada llamada hay que salvar contextos, ejecutar y recuperar contexto (continuos CALL y RETN), y en los iterativos siemplemente es realizar un bucle (o varios) sumando o restando valores en registros del procesador.
Un saludo.