SlideShare una empresa de Scribd logo
Ordenación de vectores en C: burbuja, selección directa y quicksort
22 abril 2008 in ...en lenguaje C, ...para estudiantes, Programación
(Este artículo forma parte del Curso de Programación en C)
Ya hemos hablado de la definición de vectores y de las operaciones básicas con
vectores. Ahora nos detendremos en uno de los problemas clásicos de la programación
de vectores: la ordenación de sus elementos.
Ordenar los elementos de un vector mediante algún criterio es una operación típica y en
absoluto trivial. Por ejemplo, un vector de números enteros puede ordenarse de menor a
mayor. Si el vector original es este:
0 1 2 3 4
+---+---+----+---+---+
| 5 | 3 | 14 | 9 | 8 |
+---+---+----+---+---+
…si lo ordenamos de forma creciente (de menor a mayor), nos quedará este otro vector:
0 1 2 3 4
+---+---+---+---+----+
| 3 | 5 | 8 | 9 | 14 |
+---+---+---+---+----+
Del mismo modo, se pueden ordenar los elementos con cualquier otro criterio: de mayor
a menor, primero los pares y luego los impares, o cualquier otro que nos resulte útil para
resolver un problema.
Métodos de ordenación de vectores hay muchos, desde los más simples (e ineficientes)
hasta los más elaborados, y constituyen un área de estudio muy interesante dentro de la
algorítmica.
A continuación mostraremos tres métodos de ordenación muy populares:
 El método de la burbuja (o de intercambio directo), un método sencillo de
entender pero bastante lento
 El método de selección directa, otro método simple e ineficiente.
 El método rápido o quicksort, un algoritmo elegante y recursivo que ordena
vectores con asombrosa rapidez.
Cualquier estudiante de programación debe leer los tres algoritmos detenidamente y
tratar de comprenderlos. Dibuje en un papel un vector desordenado de pocos elementos
y haga un traceo de cada función de ordenación para comprender cómo actúa. Debería
ser capaz de entender el funcionamiento de, al menos, el método de la burbuja y el de
selección directa.
(Nota: en lo que sigue, LONGITUD_VECTOR es una constante que se supone definida
en alguna otra parte del programa)
Ordenación por INTERCAMBIO DIRECTO (burbuja)
El método de la burbuja es muy ineficiente, es decir, tarda mucho tiempo
en ordenar un vector si éste es muy largo. Pero es fácil de entender, así que
vamos a comenzar poraquí.
La idea general es simple: tomaremos los dos primeros elementos y los
compararemos. Si están desordenados, intercambiamos sus posiciones. Si
están ordenados, los dejamos como están.
Después haremos lo mismo conlos elementos segundo y tercero (comparar
y, si es necesario, intercambiar). Luego, conel tercero y el cuarto. Después
con el cuarto y el quinto, y así sucesivamente hasta recorrer el vector
completo.
Cuando lleguemos al final, el vector no estará todavía ordenado, pero el
elemento más grandedel vector habrá subidohasta la última posición,
igualque una burbuja deaire en el agua.
Si volvemos a repetir el proceso desdeel principio, el segundo elemento
más grande habrá subido hasta la penúltima posición del vector. Y, la
siguiente vez, el tercer elemento más grande subirá hasta la antepenúltima
posición. Y así hasta que ordenemos todos los elementos.
Si el vector tiene N elementos, hay que repetir el recorrido N veces, aunque
en cada repetición podemos quedarnos una posición más abajo del final, ya
que sabemos conseguridad que los últimos elementos están colocadosen
su sitio.
El algoritmo funciona exactamente igual si recorremos el vector desdeel
final hacia el principio, sólo que, en ese caso, sonlos elementos más
pequeños los que van descendiendo y colocándoseen su posición definitiva
en cada iteración del algoritmo.
En la siguiente implementación, usamos este segundo enfoque: repetimos
el proceso tantas veces como elementos tenga el vector
(LONGITUD_VECTOR) y, en cadarepetición, recorremos el vector desde
el final hacia atrás, comparando e intercambiando pares adyacentes de
elementos.
(Aviso importante: la plantilla de WordPress muestra automáticamentedos
caracteres “-” consecutivos cómo si fueran un guión largo “–”. Sidesea
usar esta implementación, recuerdeque debe deshacer ese cambio)
void ordena_vector(int v[LONGITUD_VECTOR])
{
int i, j, elem;
for (i = 1; i < LONGITUD_VECTOR; i++)
{
for (j = LONGITUD_VECTOR - 1; j >=i; j--)
{
if (v[j-1] > v[j])
{
elem = v[j-1];
v[j-1] = v[j];
v[j] = elem;
}
}
}
}
El método de la burbuja necesita muchos pasos para completarse (y poreso
tarda tanto y se dice que es un algoritmo ineficiente). En concreto, si vector
tiene N elementos, hay que ejecutar alrededor de N*N pasos para
completar la ordenación. El tiempo de ejecución es proporcionalal número
de pasos necesarios y, porlo tanto, crecerá exponencialmente (al ritmo de
N2) con el tamaño del vector. Por eso no es un método práctico cuando se
trata de vectores muy grandes.
El método de la burbuja admite varias mejoras de rendimiento, como se
explica aquí.
Ordenación por SELECCIÓN DIRECTA
El algoritmo de selección directa también parte de un concepto bastante
simple: recorrer todo el vector para buscarel elemento más pequeño y, una
vez localizado, colocarlo en la primera posición. El elemento que estuviera
ocupando la primera posición debe ser movido al lugar donde estaba el
elemento más pequeño, claro, o de lo contrario se sobreescribiría y se
perdería para siempre.
Después, haremos lo mismo buscando el segundoelemento más pequeño,
moviéndolo a la segunda posición del vector. Luego buscamos el tercer
elemento más pequeño, el cuarto, etc. Repitiendo esta búsquedatantas
veces como elementos tenga el vector, habremos conseguido ordenarlo.
A continuación se presenta una posible implementación en C. Observe que
también se necesitan dos bucles anidados para culminar el proceso, porlo
que el número de pasos necesarios es alrededor de N2 y, por lo tanto, el
tiempo de ejecución también crece exponencialmente, como en el caso de
la burbuja.
void ordena_vector(int v[LONGITUD_VECTOR])
{
int i, j, minimo, posicion_minimo;
for (i = 0; i < LONGITUD_VECTOR; i++)
{
minimo = v[i];
posicion_minimo = i;
for (j=i; j < LONGITUD_VECTOR; j++)
{
if (v[j] < minimo)
{
minimo = v[j];
posicion_minimo = j;
}
}
v[posicion_minimo] = v[i];
v[i] = minimo;
}
}
Ordenación rápida (QUICKSORT)
El algoritmo Quicksort (u ordenación rápida) es un método de ordenación mucho más
elaborado que los dos anteriores y, por lo tanto, más difícil de comprender. Fue
desarrollado en 1960 por C. R. Hoare. La versión que presentamos es recursiva, pero
existen implementaciones equivalentes iterativas, más difíciles (todavía) de comprender,
pero más rápidas.
La idea es la siguiente: tomemos un elemento cualquiera del vector (generalmente el
elemento central), que llamaremos pivote. Buscamos a la derecha del pivote todos los
elementos que deberían estar a la izquierda (porque sean más pequeños que el pivote) y,
a la izquierda, todos los que deberían estar a la derecha (por ser más grandes) e
intercambiémoslos.
El proceso de intercambio de pares se repetirá hasta que alcancemos el pivote.
Entonces, sabremos que todos los elementos de la derecha del pivote son mayores que
éste, y, los de la derecha, son menores.
Ahora dividimos el vector en dos mitades: a la izquierda del pivote y a la derecha del
pivote. Procesaremos cada mitad con el mismo procedimiento: buscar un nuevo pivote e
intercambiar elementos de la izquierda y de la derecha.
Repetiremos el proceso hasta que los vectores sean triviales (es decir, hasta que el
pivote coincida con los extremos izquierdo y/o derecho).
Este algoritmo necesita, por término medio, un número de pasos proporcional a N *
log(N). Puede que no parezca mucho comparado con el N2 que necesita la burbuja,
pero, para tamaños muy grandes, la diferencia de tiempos es enorme.
NOTA: en esta implementación, por simplicidad, el vector v es una variable global
void ordena_vector(int iz, int de)
{
int i, j, x, w; i = iz;
j = de;
x = v[(iz+de) / 2];
do
{
while (v[i] < x) i++;
while (x < v[j]) j--;
if (i <= j)
{
w = v[i];
v[i] = v[j];
v[j] = w;
i++;
j--;
}
}
while (i <= j);
w = v[i];
v[i] = v[de];
v[de] = w;
if (iz < j) ordena_vector(iz, j);
if (i < de) ordena_vector(i, de);
}
(Aviso importante: la plantilla de WordPress muestra automáticamente dos caracteres
“-” consecutivos cómo si fueran un guión largo “–”. Si desea usar esta
implementación, recuerde que debe deshacer ese cambio)
como desarrollar el siguiente vector:
1.- Calcular el promedio de entre 1 y 100 valores almacenados en un vector. Determinar
además, cuántos son mayores que el promedio, imprimir el promedio, el número de
datos mayores que el promedio y una lista de valores mayores que el promedio
Le daré algunas pistas para que usted mismo desarrolle el programa (así es mucho más
divertido).
Supongamos que su vector se llama v y está declarado como:
int v[100];
Primero, introduzca los valores en el vector. Mejor valores aleatorios.
Después, haga un recorrido por el vector mediante un bucle for (desde 0 hasta 99,
ambos incluidos). Supongamos que la variable del bucle es i. Vaya sumando cada
elemento v[i] en una variable acumulador, de manera que, en cada paso, la variable
conserve su valor anterior y se incremente en v[i]. Así irá sumando todos los valores del
vector. No olvide inicializar el acumulador.
(Puede ver más sobre acumuladores aquí)
Cuando termine, divida el valor del acumulador entre 100: eso le dará el valor medio.
¡Ya puede imprimirlo!
Ahora inicialice dos contadores, uno para los valores menores que la media y otro para
los mayores.
Haga otro recorrido por el vector desde el 0 hasta el 99, pero ahora no acumule nada:
limítese a ver, con un if, si cada v[i] es menor y mayor que la media. Incremente uno de
los dos contadores en cada caso.
Cuando termine, podrá imprimir lo que tenga en cada contador: uno contendrá la
cantidad de números por debajo de la media, y el otro la cantidad de números por
encima de la media.
Parece una receta de cocina, ¿eh? Pero así son los algoritmos. Ánimo.
quisierasaberque funcioncumpleel metodoburbujaenc++….
El método burbuja (o de intercambio directo) es uno de los muchos que existen para
ordenar vectores según algún criterio. En el artículo, ordenábamos vectores de números
enteros de menor a mayor, pero cualquier método puede alterarse para ordenar de mayor
a menor o de cualquier otra manera, así como para ordenar vectores de cualquier tipo de
elemento.
¿Y para que sirve esto? Bueno, las aplicaciones prácticas son ilimitadas. En cualquier
situación en la que se necesite ordenar una lista de datos cualesquiera, será necesario un
método de ordenación de vectores.
Por cierto: como se menciona en el artículo, el de la burbuja es popular sólo porque es
sencillo de entender y recordar, pero resulta muy ineficiente si el volumen de datos que
hay que ordenar es elevado.
holaayuda porfavorr si fueratan amable
un programaen c ++ que implemente el metodode laburbujaparaordenar100 000 000 000
000 de numerosenteros
…bye
Supongo que alguien le habrá propuesto esa actividad como un ejercicio para que
aprenda a ordenar vectores. Pero si le proporcionásemos una solución completa, nunca
aprendería, así que no lo haremos.
Tiene usted un poco más arriba una implementación de la burbuja empaquetada en una
función. Trate de adaptarla a su problema. Es mucho más edificante que copiar la
solución de otro.
Ahora bien, tendrá serias dificultades para alojar en la memoria un vector cien billones
de posiciones. Suponiendo que cada número entero ocupe 4 bytes, necesitaría, haciendo
un cálculo aproximado, varios cientos de Terabytes para almacenarlo. Eso está más allá
de las capacidades de almacenamiento en memoria RAM de cualquier ordenador
convencional, y también más allá de la capacidad de los discos duros. Así que, o bien
exagera usted, o bien su vector no puede ser procesado mediante técnicas
convencionales.
Díganos si esa fabulosa cantidad es cierta y estaremos gustosos de crear un nuevo post
al respecto: “procesando vectores gigantes”.
como ordenaría numeros positivos y números negativos?
#include
#include
void main()
{
int n[4];
int aux[4];
int aux2[4];
int i=0, j=0,h=0;
clrscr();
for(i=0;i<3;i++)
{
printf(“Ingrese un numero: “);
scanf(“%d”,&n[i]);
}
for(i=0;i<=3;i++)
{
if((n[j]%2)==0)
{
aux[j]=n[j];
n[j]=n[j];
n[j]=aux[j];
}
else
{
aux2[j]=n[j];
n[j]=n[j];
n[j]=aux2[j];
}
}
printf(“nEstos son los numeros positivos: n”);
for(h=0;h<=3;h++)
{
printf(” %d”,aux[h]);
}
printf(“nEstos son los numeros negativos: n”);
for(j=0;j<=3;j++)
{
printf(” %d”,aux2[j]);
}
getch();
}
Esto es lo que he logrado hacer pero el programa no me muestra los valores ¿por que?
Lo que este programa pretende hacer (sin llegar a conseguirlo) es separar los pares y los
impares en dos vectores diferentes (aux y aux2). Bien, es un primer paso, pero luego
todavía le quedaría ordenar cada uno de los vectores resultantes.
No funciona por diversas razones. Le comento los errores que saltan a la vista de un
primer vistazo:
- Sólo se ingresan 3 números, cuando en el vector n caben 4.
- El bucle que separa los números en pares e impares está construido sobre la variable i
(for i…), pero en su interior utiliza usted la variable j.
- Los vectores aux y aux2 son de longitud 4, como el vector original (n). Pero al separar
pares e impares, los vectores resultantes (aux y aux2) difícilmente tendrán 4 valores
asignados, a menos que los cuatro números ingresados sean pares (y entonces el vector
de impares quedará vacío), o al revés. Eso hace que queden valores “basura” en las
posiciones no usadas de los vectores aux y aux2.
- ¿Qué sentido tiene la asignación n[j] = n[j]? La escribe usted dos veces en su código.
¿Y para qué sirve hacer n[j] = aux[j] justo después?
Function OrdenaFlujos(RangoDatos As Range)
numdatos = RangoDatos.Cells.Count / 2
Dim MatrizSinOrdenar As Variant
ReDim MatrizSinOrdenar(1 To numdatos, 1 To 2)
For n = 1 To numdatos
MatrizSinOrdenar(n, 1) = RangoDatos(n, 1)
MatrizSinOrdenar(n, 2) = RangoDatos(n, 2)
Next
For n = 1 To numdatos
For i = 1 To (numdatos – 1)
If (MatrizSinOrdenar(i, 1) > MatrizSinOrdenar(i + 1, 1)) Then
elementofecha = MatrizSinOrdenar(i, 1)
MatrizSinOrdenar(i, 1) = MatrizSinOrdenar(i + 1, 1)
MatrizSinOrdenar(i + 1, 1) = elementofecha
elementoflujo = MatrizSinOrdenar(i, 2)
MatrizSinOrdenar(i, 2) = MatrizSinOrdenar(i + 1, 2)
MatrizSinOrdenar(i + 1, 2) = elementoflujo
End If
Next
Next
OrdenaFlujos = MatrizSinOrdenar
End Function
Hola felicidades por tu pagina y por lo bien explicado que esta, mi pregunta es la
siguiente ¿Como eliminar numero repetido en un vector? lo he estado intentando pero
no he podido hacerlo ya intente crear un vector nuevo copiarlo lo que hice es q lo
ordene de menor a mayor ,el vector lo lleno con numeros aleatorios que el mismo
programa genera , aqui dejo parte de mi codigo ojala me pudieras decir mis errores.
…
//ordeno mi vector
int tem,j,g=0,n[g];
for(i=0;i<20;i++)
{
for(j=i+1;j<20;j++)
{
if(c[j]<c[i])
{
tem=c[j];
c[j]=c[i];
c[i]=tem;
}
}
}
//quito numeros iguales y los convierto cero
for(i=0;i<20;i++)
{
for(j=i+1;j<20;j++)
{
if(c[i]==c[j])
{
tem=c[j];
c[j]=c[i];
c[i]=0;
}
}
}
aqui imprimo el vector y si los numeros q se repiten me los marca con 0 lo pero me lo
imprime asi por ejemplo :
0 1 0 2 0 8 0 9
lo que quiero hacer es mandar al final los ceros para q quede asi
1 2 8 9 0 0 0 0
y ya despues imprimir el vector
1 2 8 9
espero me puedas ayudar a darme una idea gracias.

Más contenido relacionado

La actualidad más candente

Paradigmas de programacion
Paradigmas de programacionParadigmas de programacion
Paradigmas de programacion
yamy matin
 
Ordenar arreglos en java
Ordenar arreglos en javaOrdenar arreglos en java
Ordenar arreglos en java
eccutpl
 
Pilas como estructura de datos..
Pilas como estructura de datos..Pilas como estructura de datos..
Pilas como estructura de datos..
NANO-06
 
Metodos de ordenamiento
Metodos de ordenamientoMetodos de ordenamiento
Metodos de ordenamiento
Smith Suarez Vargas
 
Ordenamiento burbuja
Ordenamiento burbujaOrdenamiento burbuja
Ordenamiento burbuja
Oscar Mora
 
3.creacion de componentes visuales
3.creacion de componentes visuales3.creacion de componentes visuales
3.creacion de componentes visuales
Jose Benítez Andrades
 
Representacion de datos
Representacion de datosRepresentacion de datos
Representacion de datos
JOSE MENDOZA
 
Programación de microcontrolador
Programación de microcontroladorProgramación de microcontrolador
Programación de microcontrolador
Taqui Wajuyat Flor
 
Unidad 1 introducción a las estructuras de datos
Unidad 1 introducción a las estructuras de datosUnidad 1 introducción a las estructuras de datos
Unidad 1 introducción a las estructuras de datos
Urban Skate House
 
Programacion Orientada a Objetos - Undiad 4 polimorfismo
Programacion Orientada a Objetos - Undiad 4 polimorfismoProgramacion Orientada a Objetos - Undiad 4 polimorfismo
Programacion Orientada a Objetos - Undiad 4 polimorfismo
José Antonio Sandoval Acosta
 
Arraylist
ArraylistArraylist
Arraylist
Fernando Solis
 
Programacion orientada a objetos en javascript
Programacion orientada a objetos en javascriptProgramacion orientada a objetos en javascript
Programacion orientada a objetos en javascript
Robert Moreira
 
Programación de microcontroladores
Programación de microcontroladoresProgramación de microcontroladores
Programación de microcontroladores
Microprocesador Dennis Marilyn
 
Aplicaciòn de las estructuras de datos
Aplicaciòn de las estructuras de datosAplicaciòn de las estructuras de datos
Aplicaciòn de las estructuras de datos
K Manuel TN
 
Estructura de Datos - Unidad 6 Metodos de busqueda
Estructura de Datos - Unidad 6 Metodos de busquedaEstructura de Datos - Unidad 6 Metodos de busqueda
Estructura de Datos - Unidad 6 Metodos de busqueda
José Antonio Sandoval Acosta
 
Codigos
Codigos Codigos
Codigos
andres cadenas
 
Estructura de Datos - Estructuras no lineales
Estructura de Datos - Estructuras no linealesEstructura de Datos - Estructuras no lineales
Estructura de Datos - Estructuras no lineales
José Antonio Sandoval Acosta
 
Arreglos programacion
Arreglos programacionArreglos programacion
Arreglos programacion
ashildir
 
Mètodos de Ordenaciòn y bùsqueda
Mètodos de Ordenaciòn y bùsquedaMètodos de Ordenaciòn y bùsqueda
Mètodos de Ordenaciòn y bùsqueda
Facultad de Ciencias y Sistemas
 

La actualidad más candente (20)

Paradigmas de programacion
Paradigmas de programacionParadigmas de programacion
Paradigmas de programacion
 
Ordenar arreglos en java
Ordenar arreglos en javaOrdenar arreglos en java
Ordenar arreglos en java
 
Pilas como estructura de datos..
Pilas como estructura de datos..Pilas como estructura de datos..
Pilas como estructura de datos..
 
Metodos de ordenamiento
Metodos de ordenamientoMetodos de ordenamiento
Metodos de ordenamiento
 
Ordenamiento burbuja
Ordenamiento burbujaOrdenamiento burbuja
Ordenamiento burbuja
 
3.creacion de componentes visuales
3.creacion de componentes visuales3.creacion de componentes visuales
3.creacion de componentes visuales
 
Representacion de datos
Representacion de datosRepresentacion de datos
Representacion de datos
 
Programación de microcontrolador
Programación de microcontroladorProgramación de microcontrolador
Programación de microcontrolador
 
Unidad 1 introducción a las estructuras de datos
Unidad 1 introducción a las estructuras de datosUnidad 1 introducción a las estructuras de datos
Unidad 1 introducción a las estructuras de datos
 
Programacion Orientada a Objetos - Undiad 4 polimorfismo
Programacion Orientada a Objetos - Undiad 4 polimorfismoProgramacion Orientada a Objetos - Undiad 4 polimorfismo
Programacion Orientada a Objetos - Undiad 4 polimorfismo
 
Arraylist
ArraylistArraylist
Arraylist
 
Programacion orientada a objetos en javascript
Programacion orientada a objetos en javascriptProgramacion orientada a objetos en javascript
Programacion orientada a objetos en javascript
 
Programación de microcontroladores
Programación de microcontroladoresProgramación de microcontroladores
Programación de microcontroladores
 
Aplicaciòn de las estructuras de datos
Aplicaciòn de las estructuras de datosAplicaciòn de las estructuras de datos
Aplicaciòn de las estructuras de datos
 
Estructura de Datos - Unidad 6 Metodos de busqueda
Estructura de Datos - Unidad 6 Metodos de busquedaEstructura de Datos - Unidad 6 Metodos de busqueda
Estructura de Datos - Unidad 6 Metodos de busqueda
 
Codigos
Codigos Codigos
Codigos
 
Estructura de Datos - Estructuras no lineales
Estructura de Datos - Estructuras no linealesEstructura de Datos - Estructuras no lineales
Estructura de Datos - Estructuras no lineales
 
Proteus
ProteusProteus
Proteus
 
Arreglos programacion
Arreglos programacionArreglos programacion
Arreglos programacion
 
Mètodos de Ordenaciòn y bùsqueda
Mètodos de Ordenaciòn y bùsquedaMètodos de Ordenaciòn y bùsqueda
Mètodos de Ordenaciòn y bùsqueda
 

Similar a Ordenación de vectores en c++

Ordenación de vectores en c++
Ordenación de vectores en c++Ordenación de vectores en c++
Ordenación de vectores en c++kjjkfhjsfhjsfh
 
Divide y Vencerás
Divide y VencerásDivide y Vencerás
Divide y Vencerás
Salvador Fernández Fernández
 
Semana 4 arreglos simples (1)
Semana 4   arreglos simples (1)Semana 4   arreglos simples (1)
Semana 4 arreglos simples (1)
Julie Suazo
 
7 Stl Y Los Contenedores Basicos 2 Parte
7 Stl Y Los Contenedores Basicos 2 Parte7 Stl Y Los Contenedores Basicos 2 Parte
7 Stl Y Los Contenedores Basicos 2 ParteUVM
 
Programacion fantasticos
Programacion  fantasticosProgramacion  fantasticos
Programacion fantasticos
Brenda Jazmin
 
Tema_4.pdf
Tema_4.pdfTema_4.pdf
Tema_4.pdf
fabianaMorales15
 
Jflambert lyada - ayudantia matematicas discretas
Jflambert   lyada - ayudantia matematicas discretasJflambert   lyada - ayudantia matematicas discretas
Jflambert lyada - ayudantia matematicas discretasFrancisco Lambert Obediente
 
Jflambert lyada - ayudantia ordenamiento y teo maestro
Jflambert   lyada - ayudantia ordenamiento y teo maestroJflambert   lyada - ayudantia ordenamiento y teo maestro
Jflambert lyada - ayudantia ordenamiento y teo maestroFrancisco Lambert Obediente
 
Aplicación de métodos numéricos de análisis. Cálculo del tipo de interés en l...
Aplicación de métodos numéricos de análisis. Cálculo del tipo de interés en l...Aplicación de métodos numéricos de análisis. Cálculo del tipo de interés en l...
Aplicación de métodos numéricos de análisis. Cálculo del tipo de interés en l...José Manuel Gómez Vega
 
Act 2 taller
Act 2 tallerAct 2 taller
Act 2 tallergemelus
 
arreglos.ppt
arreglos.pptarreglos.ppt
Tutorial rapido de octave
Tutorial rapido de octaveTutorial rapido de octave
Tutorial rapido de octave
Clau de Gregorio
 
2. guia 2 vectores y graficos en matlab
2. guia 2   vectores y graficos en matlab2. guia 2   vectores y graficos en matlab
2. guia 2 vectores y graficos en matlab
Alejandra Duque Ceballos
 
2 vectores matrices
2 vectores matrices2 vectores matrices
2 vectores matrices
eduin villavicencio
 
2 vectores matrices
2 vectores matrices2 vectores matrices
2 vectores matrices
Abrahan Mesias Jorque Rea
 
Cálculo del tipo de interés de la ecuación de la cuota periódica del préstamo...
Cálculo del tipo de interés de la ecuación de la cuota periódica del préstamo...Cálculo del tipo de interés de la ecuación de la cuota periódica del préstamo...
Cálculo del tipo de interés de la ecuación de la cuota periódica del préstamo...
José Manuel Gómez Vega
 
Vectores y matrices
Vectores y matricesVectores y matrices
Vectores y matrices
Sohar Carr
 
Unidad 1 1
Unidad 1   1Unidad 1   1
Unidad 1 1VivianaG
 
Estructuras de datos 1(Arrays y Estructuras)
Estructuras de datos 1(Arrays y Estructuras)Estructuras de datos 1(Arrays y Estructuras)
Estructuras de datos 1(Arrays y Estructuras)
jairml
 

Similar a Ordenación de vectores en c++ (20)

Ordenación de vectores en c++
Ordenación de vectores en c++Ordenación de vectores en c++
Ordenación de vectores en c++
 
Divide y Vencerás
Divide y VencerásDivide y Vencerás
Divide y Vencerás
 
Semana 4 arreglos simples (1)
Semana 4   arreglos simples (1)Semana 4   arreglos simples (1)
Semana 4 arreglos simples (1)
 
7 Stl Y Los Contenedores Basicos 2 Parte
7 Stl Y Los Contenedores Basicos 2 Parte7 Stl Y Los Contenedores Basicos 2 Parte
7 Stl Y Los Contenedores Basicos 2 Parte
 
Complejidad Computacional
Complejidad ComputacionalComplejidad Computacional
Complejidad Computacional
 
Programacion fantasticos
Programacion  fantasticosProgramacion  fantasticos
Programacion fantasticos
 
Tema_4.pdf
Tema_4.pdfTema_4.pdf
Tema_4.pdf
 
Jflambert lyada - ayudantia matematicas discretas
Jflambert   lyada - ayudantia matematicas discretasJflambert   lyada - ayudantia matematicas discretas
Jflambert lyada - ayudantia matematicas discretas
 
Jflambert lyada - ayudantia ordenamiento y teo maestro
Jflambert   lyada - ayudantia ordenamiento y teo maestroJflambert   lyada - ayudantia ordenamiento y teo maestro
Jflambert lyada - ayudantia ordenamiento y teo maestro
 
Aplicación de métodos numéricos de análisis. Cálculo del tipo de interés en l...
Aplicación de métodos numéricos de análisis. Cálculo del tipo de interés en l...Aplicación de métodos numéricos de análisis. Cálculo del tipo de interés en l...
Aplicación de métodos numéricos de análisis. Cálculo del tipo de interés en l...
 
Act 2 taller
Act 2 tallerAct 2 taller
Act 2 taller
 
arreglos.ppt
arreglos.pptarreglos.ppt
arreglos.ppt
 
Tutorial rapido de octave
Tutorial rapido de octaveTutorial rapido de octave
Tutorial rapido de octave
 
2. guia 2 vectores y graficos en matlab
2. guia 2   vectores y graficos en matlab2. guia 2   vectores y graficos en matlab
2. guia 2 vectores y graficos en matlab
 
2 vectores matrices
2 vectores matrices2 vectores matrices
2 vectores matrices
 
2 vectores matrices
2 vectores matrices2 vectores matrices
2 vectores matrices
 
Cálculo del tipo de interés de la ecuación de la cuota periódica del préstamo...
Cálculo del tipo de interés de la ecuación de la cuota periódica del préstamo...Cálculo del tipo de interés de la ecuación de la cuota periódica del préstamo...
Cálculo del tipo de interés de la ecuación de la cuota periódica del préstamo...
 
Vectores y matrices
Vectores y matricesVectores y matrices
Vectores y matrices
 
Unidad 1 1
Unidad 1   1Unidad 1   1
Unidad 1 1
 
Estructuras de datos 1(Arrays y Estructuras)
Estructuras de datos 1(Arrays y Estructuras)Estructuras de datos 1(Arrays y Estructuras)
Estructuras de datos 1(Arrays y Estructuras)
 

Último

PRÁCTICAS PEDAGOGÍA.pdf_Educación Y Sociedad_AnaFernández
PRÁCTICAS PEDAGOGÍA.pdf_Educación Y Sociedad_AnaFernándezPRÁCTICAS PEDAGOGÍA.pdf_Educación Y Sociedad_AnaFernández
PRÁCTICAS PEDAGOGÍA.pdf_Educación Y Sociedad_AnaFernández
Ruben53283
 
El Liberalismo económico en la sociedad y en el mundo
El Liberalismo económico en la sociedad y en el mundoEl Liberalismo económico en la sociedad y en el mundo
El Liberalismo económico en la sociedad y en el mundo
SandraBenitez52
 
Portafolio de servicios Centro de Educación Continua EPN
Portafolio de servicios Centro de Educación Continua EPNPortafolio de servicios Centro de Educación Continua EPN
Portafolio de servicios Centro de Educación Continua EPN
jmorales40
 
Testimonio Paco Z PATRONATO_Valencia_24.pdf
Testimonio Paco Z PATRONATO_Valencia_24.pdfTestimonio Paco Z PATRONATO_Valencia_24.pdf
Testimonio Paco Z PATRONATO_Valencia_24.pdf
Txema Gs
 
Fase 2, Pensamiento variacional y trigonometrico
Fase 2, Pensamiento variacional y trigonometricoFase 2, Pensamiento variacional y trigonometrico
Fase 2, Pensamiento variacional y trigonometrico
YasneidyGonzalez
 
Libro infantil sapo y sepo un año entero pdf
Libro infantil sapo y sepo un año entero pdfLibro infantil sapo y sepo un año entero pdf
Libro infantil sapo y sepo un año entero pdf
danitarb
 
Sesión: El fundamento del gobierno de Dios.pdf
Sesión: El fundamento del gobierno de Dios.pdfSesión: El fundamento del gobierno de Dios.pdf
Sesión: El fundamento del gobierno de Dios.pdf
https://gramadal.wordpress.com/
 
CUENTO EL TIGRILLO DESOBEDIENTE PARA INICIAL
CUENTO EL TIGRILLO DESOBEDIENTE PARA INICIALCUENTO EL TIGRILLO DESOBEDIENTE PARA INICIAL
CUENTO EL TIGRILLO DESOBEDIENTE PARA INICIAL
DivinoNioJess885
 
INFORME MINEDU DEL PRIMER SIMULACRO 2024.pdf
INFORME MINEDU DEL PRIMER SIMULACRO 2024.pdfINFORME MINEDU DEL PRIMER SIMULACRO 2024.pdf
INFORME MINEDU DEL PRIMER SIMULACRO 2024.pdf
Alejandrogarciapanta
 
El fundamento del gobierno de Dios. Lec. 09. docx
El fundamento del gobierno de Dios. Lec. 09. docxEl fundamento del gobierno de Dios. Lec. 09. docx
El fundamento del gobierno de Dios. Lec. 09. docx
Alejandrino Halire Ccahuana
 
FICHA DE EJERCICIOS GRECIA 1º DE LA ESO HISTORIA
FICHA DE EJERCICIOS GRECIA 1º DE LA ESO HISTORIAFICHA DE EJERCICIOS GRECIA 1º DE LA ESO HISTORIA
FICHA DE EJERCICIOS GRECIA 1º DE LA ESO HISTORIA
JavierMontero58
 
CONCLUSIONES-DESCRIPTIVAS NIVEL PRIMARIA
CONCLUSIONES-DESCRIPTIVAS NIVEL PRIMARIACONCLUSIONES-DESCRIPTIVAS NIVEL PRIMARIA
CONCLUSIONES-DESCRIPTIVAS NIVEL PRIMARIA
BetzabePecheSalcedo1
 
PRESENTACION DE LA SEMANA NUMERO 8 EN APLICACIONES DE INTERNET
PRESENTACION DE LA SEMANA NUMERO 8 EN APLICACIONES DE INTERNETPRESENTACION DE LA SEMANA NUMERO 8 EN APLICACIONES DE INTERNET
PRESENTACION DE LA SEMANA NUMERO 8 EN APLICACIONES DE INTERNET
CESAR MIJAEL ESPINOZA SALAZAR
 
Horarios y fechas de la PAU 2024 en la Comunidad Valenciana.
Horarios y fechas de la PAU 2024 en la Comunidad Valenciana.Horarios y fechas de la PAU 2024 en la Comunidad Valenciana.
Horarios y fechas de la PAU 2024 en la Comunidad Valenciana.
20minutos
 
3° UNIDAD 3 CUIDAMOS EL AMBIENTE RECICLANDO EN FAMILIA 933623393 PROF YESSENI...
3° UNIDAD 3 CUIDAMOS EL AMBIENTE RECICLANDO EN FAMILIA 933623393 PROF YESSENI...3° UNIDAD 3 CUIDAMOS EL AMBIENTE RECICLANDO EN FAMILIA 933623393 PROF YESSENI...
3° UNIDAD 3 CUIDAMOS EL AMBIENTE RECICLANDO EN FAMILIA 933623393 PROF YESSENI...
rosannatasaycoyactay
 
Semana 10-TSM-del 27 al 31 de mayo 2024.pptx
Semana 10-TSM-del 27 al 31 de mayo 2024.pptxSemana 10-TSM-del 27 al 31 de mayo 2024.pptx
Semana 10-TSM-del 27 al 31 de mayo 2024.pptx
LorenaCovarrubias12
 
Fase 1, Lenguaje algebraico y pensamiento funcional
Fase 1, Lenguaje algebraico y pensamiento funcionalFase 1, Lenguaje algebraico y pensamiento funcional
Fase 1, Lenguaje algebraico y pensamiento funcional
YasneidyGonzalez
 
Mapa_Conceptual de los fundamentos de la evaluación educativa
Mapa_Conceptual de los fundamentos de la evaluación educativaMapa_Conceptual de los fundamentos de la evaluación educativa
Mapa_Conceptual de los fundamentos de la evaluación educativa
TatianaVanessaAltami
 
PPT: El fundamento del gobierno de Dios.
PPT: El fundamento del gobierno de Dios.PPT: El fundamento del gobierno de Dios.
PPT: El fundamento del gobierno de Dios.
https://gramadal.wordpress.com/
 
CALENDARIZACION DEL MES DE JUNIO - JULIO 24
CALENDARIZACION DEL MES DE JUNIO - JULIO 24CALENDARIZACION DEL MES DE JUNIO - JULIO 24
CALENDARIZACION DEL MES DE JUNIO - JULIO 24
auxsoporte
 

Último (20)

PRÁCTICAS PEDAGOGÍA.pdf_Educación Y Sociedad_AnaFernández
PRÁCTICAS PEDAGOGÍA.pdf_Educación Y Sociedad_AnaFernándezPRÁCTICAS PEDAGOGÍA.pdf_Educación Y Sociedad_AnaFernández
PRÁCTICAS PEDAGOGÍA.pdf_Educación Y Sociedad_AnaFernández
 
El Liberalismo económico en la sociedad y en el mundo
El Liberalismo económico en la sociedad y en el mundoEl Liberalismo económico en la sociedad y en el mundo
El Liberalismo económico en la sociedad y en el mundo
 
Portafolio de servicios Centro de Educación Continua EPN
Portafolio de servicios Centro de Educación Continua EPNPortafolio de servicios Centro de Educación Continua EPN
Portafolio de servicios Centro de Educación Continua EPN
 
Testimonio Paco Z PATRONATO_Valencia_24.pdf
Testimonio Paco Z PATRONATO_Valencia_24.pdfTestimonio Paco Z PATRONATO_Valencia_24.pdf
Testimonio Paco Z PATRONATO_Valencia_24.pdf
 
Fase 2, Pensamiento variacional y trigonometrico
Fase 2, Pensamiento variacional y trigonometricoFase 2, Pensamiento variacional y trigonometrico
Fase 2, Pensamiento variacional y trigonometrico
 
Libro infantil sapo y sepo un año entero pdf
Libro infantil sapo y sepo un año entero pdfLibro infantil sapo y sepo un año entero pdf
Libro infantil sapo y sepo un año entero pdf
 
Sesión: El fundamento del gobierno de Dios.pdf
Sesión: El fundamento del gobierno de Dios.pdfSesión: El fundamento del gobierno de Dios.pdf
Sesión: El fundamento del gobierno de Dios.pdf
 
CUENTO EL TIGRILLO DESOBEDIENTE PARA INICIAL
CUENTO EL TIGRILLO DESOBEDIENTE PARA INICIALCUENTO EL TIGRILLO DESOBEDIENTE PARA INICIAL
CUENTO EL TIGRILLO DESOBEDIENTE PARA INICIAL
 
INFORME MINEDU DEL PRIMER SIMULACRO 2024.pdf
INFORME MINEDU DEL PRIMER SIMULACRO 2024.pdfINFORME MINEDU DEL PRIMER SIMULACRO 2024.pdf
INFORME MINEDU DEL PRIMER SIMULACRO 2024.pdf
 
El fundamento del gobierno de Dios. Lec. 09. docx
El fundamento del gobierno de Dios. Lec. 09. docxEl fundamento del gobierno de Dios. Lec. 09. docx
El fundamento del gobierno de Dios. Lec. 09. docx
 
FICHA DE EJERCICIOS GRECIA 1º DE LA ESO HISTORIA
FICHA DE EJERCICIOS GRECIA 1º DE LA ESO HISTORIAFICHA DE EJERCICIOS GRECIA 1º DE LA ESO HISTORIA
FICHA DE EJERCICIOS GRECIA 1º DE LA ESO HISTORIA
 
CONCLUSIONES-DESCRIPTIVAS NIVEL PRIMARIA
CONCLUSIONES-DESCRIPTIVAS NIVEL PRIMARIACONCLUSIONES-DESCRIPTIVAS NIVEL PRIMARIA
CONCLUSIONES-DESCRIPTIVAS NIVEL PRIMARIA
 
PRESENTACION DE LA SEMANA NUMERO 8 EN APLICACIONES DE INTERNET
PRESENTACION DE LA SEMANA NUMERO 8 EN APLICACIONES DE INTERNETPRESENTACION DE LA SEMANA NUMERO 8 EN APLICACIONES DE INTERNET
PRESENTACION DE LA SEMANA NUMERO 8 EN APLICACIONES DE INTERNET
 
Horarios y fechas de la PAU 2024 en la Comunidad Valenciana.
Horarios y fechas de la PAU 2024 en la Comunidad Valenciana.Horarios y fechas de la PAU 2024 en la Comunidad Valenciana.
Horarios y fechas de la PAU 2024 en la Comunidad Valenciana.
 
3° UNIDAD 3 CUIDAMOS EL AMBIENTE RECICLANDO EN FAMILIA 933623393 PROF YESSENI...
3° UNIDAD 3 CUIDAMOS EL AMBIENTE RECICLANDO EN FAMILIA 933623393 PROF YESSENI...3° UNIDAD 3 CUIDAMOS EL AMBIENTE RECICLANDO EN FAMILIA 933623393 PROF YESSENI...
3° UNIDAD 3 CUIDAMOS EL AMBIENTE RECICLANDO EN FAMILIA 933623393 PROF YESSENI...
 
Semana 10-TSM-del 27 al 31 de mayo 2024.pptx
Semana 10-TSM-del 27 al 31 de mayo 2024.pptxSemana 10-TSM-del 27 al 31 de mayo 2024.pptx
Semana 10-TSM-del 27 al 31 de mayo 2024.pptx
 
Fase 1, Lenguaje algebraico y pensamiento funcional
Fase 1, Lenguaje algebraico y pensamiento funcionalFase 1, Lenguaje algebraico y pensamiento funcional
Fase 1, Lenguaje algebraico y pensamiento funcional
 
Mapa_Conceptual de los fundamentos de la evaluación educativa
Mapa_Conceptual de los fundamentos de la evaluación educativaMapa_Conceptual de los fundamentos de la evaluación educativa
Mapa_Conceptual de los fundamentos de la evaluación educativa
 
PPT: El fundamento del gobierno de Dios.
PPT: El fundamento del gobierno de Dios.PPT: El fundamento del gobierno de Dios.
PPT: El fundamento del gobierno de Dios.
 
CALENDARIZACION DEL MES DE JUNIO - JULIO 24
CALENDARIZACION DEL MES DE JUNIO - JULIO 24CALENDARIZACION DEL MES DE JUNIO - JULIO 24
CALENDARIZACION DEL MES DE JUNIO - JULIO 24
 

Ordenación de vectores en c++

  • 1. Ordenación de vectores en C: burbuja, selección directa y quicksort 22 abril 2008 in ...en lenguaje C, ...para estudiantes, Programación (Este artículo forma parte del Curso de Programación en C) Ya hemos hablado de la definición de vectores y de las operaciones básicas con vectores. Ahora nos detendremos en uno de los problemas clásicos de la programación de vectores: la ordenación de sus elementos. Ordenar los elementos de un vector mediante algún criterio es una operación típica y en absoluto trivial. Por ejemplo, un vector de números enteros puede ordenarse de menor a mayor. Si el vector original es este: 0 1 2 3 4 +---+---+----+---+---+ | 5 | 3 | 14 | 9 | 8 | +---+---+----+---+---+ …si lo ordenamos de forma creciente (de menor a mayor), nos quedará este otro vector: 0 1 2 3 4 +---+---+---+---+----+ | 3 | 5 | 8 | 9 | 14 | +---+---+---+---+----+ Del mismo modo, se pueden ordenar los elementos con cualquier otro criterio: de mayor a menor, primero los pares y luego los impares, o cualquier otro que nos resulte útil para resolver un problema. Métodos de ordenación de vectores hay muchos, desde los más simples (e ineficientes) hasta los más elaborados, y constituyen un área de estudio muy interesante dentro de la algorítmica. A continuación mostraremos tres métodos de ordenación muy populares:  El método de la burbuja (o de intercambio directo), un método sencillo de entender pero bastante lento  El método de selección directa, otro método simple e ineficiente.  El método rápido o quicksort, un algoritmo elegante y recursivo que ordena vectores con asombrosa rapidez. Cualquier estudiante de programación debe leer los tres algoritmos detenidamente y tratar de comprenderlos. Dibuje en un papel un vector desordenado de pocos elementos y haga un traceo de cada función de ordenación para comprender cómo actúa. Debería ser capaz de entender el funcionamiento de, al menos, el método de la burbuja y el de selección directa. (Nota: en lo que sigue, LONGITUD_VECTOR es una constante que se supone definida en alguna otra parte del programa)
  • 2. Ordenación por INTERCAMBIO DIRECTO (burbuja) El método de la burbuja es muy ineficiente, es decir, tarda mucho tiempo en ordenar un vector si éste es muy largo. Pero es fácil de entender, así que vamos a comenzar poraquí. La idea general es simple: tomaremos los dos primeros elementos y los compararemos. Si están desordenados, intercambiamos sus posiciones. Si están ordenados, los dejamos como están. Después haremos lo mismo conlos elementos segundo y tercero (comparar y, si es necesario, intercambiar). Luego, conel tercero y el cuarto. Después con el cuarto y el quinto, y así sucesivamente hasta recorrer el vector completo. Cuando lleguemos al final, el vector no estará todavía ordenado, pero el elemento más grandedel vector habrá subidohasta la última posición, igualque una burbuja deaire en el agua. Si volvemos a repetir el proceso desdeel principio, el segundo elemento más grande habrá subido hasta la penúltima posición del vector. Y, la siguiente vez, el tercer elemento más grande subirá hasta la antepenúltima posición. Y así hasta que ordenemos todos los elementos. Si el vector tiene N elementos, hay que repetir el recorrido N veces, aunque en cada repetición podemos quedarnos una posición más abajo del final, ya que sabemos conseguridad que los últimos elementos están colocadosen su sitio. El algoritmo funciona exactamente igual si recorremos el vector desdeel final hacia el principio, sólo que, en ese caso, sonlos elementos más pequeños los que van descendiendo y colocándoseen su posición definitiva en cada iteración del algoritmo. En la siguiente implementación, usamos este segundo enfoque: repetimos el proceso tantas veces como elementos tenga el vector (LONGITUD_VECTOR) y, en cadarepetición, recorremos el vector desde el final hacia atrás, comparando e intercambiando pares adyacentes de elementos. (Aviso importante: la plantilla de WordPress muestra automáticamentedos caracteres “-” consecutivos cómo si fueran un guión largo “–”. Sidesea usar esta implementación, recuerdeque debe deshacer ese cambio)
  • 3. void ordena_vector(int v[LONGITUD_VECTOR]) { int i, j, elem; for (i = 1; i < LONGITUD_VECTOR; i++) { for (j = LONGITUD_VECTOR - 1; j >=i; j--) { if (v[j-1] > v[j]) { elem = v[j-1]; v[j-1] = v[j]; v[j] = elem; } } } } El método de la burbuja necesita muchos pasos para completarse (y poreso tarda tanto y se dice que es un algoritmo ineficiente). En concreto, si vector tiene N elementos, hay que ejecutar alrededor de N*N pasos para completar la ordenación. El tiempo de ejecución es proporcionalal número de pasos necesarios y, porlo tanto, crecerá exponencialmente (al ritmo de N2) con el tamaño del vector. Por eso no es un método práctico cuando se trata de vectores muy grandes. El método de la burbuja admite varias mejoras de rendimiento, como se explica aquí. Ordenación por SELECCIÓN DIRECTA El algoritmo de selección directa también parte de un concepto bastante simple: recorrer todo el vector para buscarel elemento más pequeño y, una vez localizado, colocarlo en la primera posición. El elemento que estuviera ocupando la primera posición debe ser movido al lugar donde estaba el elemento más pequeño, claro, o de lo contrario se sobreescribiría y se perdería para siempre. Después, haremos lo mismo buscando el segundoelemento más pequeño, moviéndolo a la segunda posición del vector. Luego buscamos el tercer elemento más pequeño, el cuarto, etc. Repitiendo esta búsquedatantas veces como elementos tenga el vector, habremos conseguido ordenarlo. A continuación se presenta una posible implementación en C. Observe que también se necesitan dos bucles anidados para culminar el proceso, porlo
  • 4. que el número de pasos necesarios es alrededor de N2 y, por lo tanto, el tiempo de ejecución también crece exponencialmente, como en el caso de la burbuja. void ordena_vector(int v[LONGITUD_VECTOR]) { int i, j, minimo, posicion_minimo; for (i = 0; i < LONGITUD_VECTOR; i++) { minimo = v[i]; posicion_minimo = i; for (j=i; j < LONGITUD_VECTOR; j++) { if (v[j] < minimo) { minimo = v[j]; posicion_minimo = j; } } v[posicion_minimo] = v[i]; v[i] = minimo; } } Ordenación rápida (QUICKSORT) El algoritmo Quicksort (u ordenación rápida) es un método de ordenación mucho más elaborado que los dos anteriores y, por lo tanto, más difícil de comprender. Fue desarrollado en 1960 por C. R. Hoare. La versión que presentamos es recursiva, pero existen implementaciones equivalentes iterativas, más difíciles (todavía) de comprender, pero más rápidas. La idea es la siguiente: tomemos un elemento cualquiera del vector (generalmente el elemento central), que llamaremos pivote. Buscamos a la derecha del pivote todos los elementos que deberían estar a la izquierda (porque sean más pequeños que el pivote) y, a la izquierda, todos los que deberían estar a la derecha (por ser más grandes) e intercambiémoslos. El proceso de intercambio de pares se repetirá hasta que alcancemos el pivote. Entonces, sabremos que todos los elementos de la derecha del pivote son mayores que éste, y, los de la derecha, son menores. Ahora dividimos el vector en dos mitades: a la izquierda del pivote y a la derecha del pivote. Procesaremos cada mitad con el mismo procedimiento: buscar un nuevo pivote e intercambiar elementos de la izquierda y de la derecha. Repetiremos el proceso hasta que los vectores sean triviales (es decir, hasta que el pivote coincida con los extremos izquierdo y/o derecho).
  • 5. Este algoritmo necesita, por término medio, un número de pasos proporcional a N * log(N). Puede que no parezca mucho comparado con el N2 que necesita la burbuja, pero, para tamaños muy grandes, la diferencia de tiempos es enorme. NOTA: en esta implementación, por simplicidad, el vector v es una variable global void ordena_vector(int iz, int de) { int i, j, x, w; i = iz; j = de; x = v[(iz+de) / 2]; do { while (v[i] < x) i++; while (x < v[j]) j--; if (i <= j) { w = v[i]; v[i] = v[j]; v[j] = w; i++; j--; } } while (i <= j); w = v[i]; v[i] = v[de]; v[de] = w; if (iz < j) ordena_vector(iz, j); if (i < de) ordena_vector(i, de); } (Aviso importante: la plantilla de WordPress muestra automáticamente dos caracteres “-” consecutivos cómo si fueran un guión largo “–”. Si desea usar esta implementación, recuerde que debe deshacer ese cambio) como desarrollar el siguiente vector: 1.- Calcular el promedio de entre 1 y 100 valores almacenados en un vector. Determinar además, cuántos son mayores que el promedio, imprimir el promedio, el número de datos mayores que el promedio y una lista de valores mayores que el promedio Le daré algunas pistas para que usted mismo desarrolle el programa (así es mucho más divertido). Supongamos que su vector se llama v y está declarado como: int v[100]; Primero, introduzca los valores en el vector. Mejor valores aleatorios. Después, haga un recorrido por el vector mediante un bucle for (desde 0 hasta 99, ambos incluidos). Supongamos que la variable del bucle es i. Vaya sumando cada elemento v[i] en una variable acumulador, de manera que, en cada paso, la variable
  • 6. conserve su valor anterior y se incremente en v[i]. Así irá sumando todos los valores del vector. No olvide inicializar el acumulador. (Puede ver más sobre acumuladores aquí) Cuando termine, divida el valor del acumulador entre 100: eso le dará el valor medio. ¡Ya puede imprimirlo! Ahora inicialice dos contadores, uno para los valores menores que la media y otro para los mayores. Haga otro recorrido por el vector desde el 0 hasta el 99, pero ahora no acumule nada: limítese a ver, con un if, si cada v[i] es menor y mayor que la media. Incremente uno de los dos contadores en cada caso. Cuando termine, podrá imprimir lo que tenga en cada contador: uno contendrá la cantidad de números por debajo de la media, y el otro la cantidad de números por encima de la media. Parece una receta de cocina, ¿eh? Pero así son los algoritmos. Ánimo. quisierasaberque funcioncumpleel metodoburbujaenc++…. El método burbuja (o de intercambio directo) es uno de los muchos que existen para ordenar vectores según algún criterio. En el artículo, ordenábamos vectores de números enteros de menor a mayor, pero cualquier método puede alterarse para ordenar de mayor a menor o de cualquier otra manera, así como para ordenar vectores de cualquier tipo de elemento. ¿Y para que sirve esto? Bueno, las aplicaciones prácticas son ilimitadas. En cualquier situación en la que se necesite ordenar una lista de datos cualesquiera, será necesario un método de ordenación de vectores. Por cierto: como se menciona en el artículo, el de la burbuja es popular sólo porque es sencillo de entender y recordar, pero resulta muy ineficiente si el volumen de datos que hay que ordenar es elevado. holaayuda porfavorr si fueratan amable un programaen c ++ que implemente el metodode laburbujaparaordenar100 000 000 000 000 de numerosenteros …bye Supongo que alguien le habrá propuesto esa actividad como un ejercicio para que aprenda a ordenar vectores. Pero si le proporcionásemos una solución completa, nunca aprendería, así que no lo haremos. Tiene usted un poco más arriba una implementación de la burbuja empaquetada en una función. Trate de adaptarla a su problema. Es mucho más edificante que copiar la solución de otro.
  • 7. Ahora bien, tendrá serias dificultades para alojar en la memoria un vector cien billones de posiciones. Suponiendo que cada número entero ocupe 4 bytes, necesitaría, haciendo un cálculo aproximado, varios cientos de Terabytes para almacenarlo. Eso está más allá de las capacidades de almacenamiento en memoria RAM de cualquier ordenador convencional, y también más allá de la capacidad de los discos duros. Así que, o bien exagera usted, o bien su vector no puede ser procesado mediante técnicas convencionales. Díganos si esa fabulosa cantidad es cierta y estaremos gustosos de crear un nuevo post al respecto: “procesando vectores gigantes”. como ordenaría numeros positivos y números negativos? #include #include void main() { int n[4]; int aux[4]; int aux2[4]; int i=0, j=0,h=0; clrscr(); for(i=0;i<3;i++) { printf(“Ingrese un numero: “); scanf(“%d”,&n[i]); } for(i=0;i<=3;i++) { if((n[j]%2)==0) { aux[j]=n[j]; n[j]=n[j]; n[j]=aux[j]; } else { aux2[j]=n[j]; n[j]=n[j]; n[j]=aux2[j]; } } printf(“nEstos son los numeros positivos: n”); for(h=0;h<=3;h++) {
  • 8. printf(” %d”,aux[h]); } printf(“nEstos son los numeros negativos: n”); for(j=0;j<=3;j++) { printf(” %d”,aux2[j]); } getch(); } Esto es lo que he logrado hacer pero el programa no me muestra los valores ¿por que? Lo que este programa pretende hacer (sin llegar a conseguirlo) es separar los pares y los impares en dos vectores diferentes (aux y aux2). Bien, es un primer paso, pero luego todavía le quedaría ordenar cada uno de los vectores resultantes. No funciona por diversas razones. Le comento los errores que saltan a la vista de un primer vistazo: - Sólo se ingresan 3 números, cuando en el vector n caben 4. - El bucle que separa los números en pares e impares está construido sobre la variable i (for i…), pero en su interior utiliza usted la variable j. - Los vectores aux y aux2 son de longitud 4, como el vector original (n). Pero al separar pares e impares, los vectores resultantes (aux y aux2) difícilmente tendrán 4 valores asignados, a menos que los cuatro números ingresados sean pares (y entonces el vector de impares quedará vacío), o al revés. Eso hace que queden valores “basura” en las posiciones no usadas de los vectores aux y aux2. - ¿Qué sentido tiene la asignación n[j] = n[j]? La escribe usted dos veces en su código. ¿Y para qué sirve hacer n[j] = aux[j] justo después? Function OrdenaFlujos(RangoDatos As Range) numdatos = RangoDatos.Cells.Count / 2 Dim MatrizSinOrdenar As Variant ReDim MatrizSinOrdenar(1 To numdatos, 1 To 2) For n = 1 To numdatos MatrizSinOrdenar(n, 1) = RangoDatos(n, 1) MatrizSinOrdenar(n, 2) = RangoDatos(n, 2) Next For n = 1 To numdatos For i = 1 To (numdatos – 1) If (MatrizSinOrdenar(i, 1) > MatrizSinOrdenar(i + 1, 1)) Then elementofecha = MatrizSinOrdenar(i, 1)
  • 9. MatrizSinOrdenar(i, 1) = MatrizSinOrdenar(i + 1, 1) MatrizSinOrdenar(i + 1, 1) = elementofecha elementoflujo = MatrizSinOrdenar(i, 2) MatrizSinOrdenar(i, 2) = MatrizSinOrdenar(i + 1, 2) MatrizSinOrdenar(i + 1, 2) = elementoflujo End If Next Next OrdenaFlujos = MatrizSinOrdenar End Function Hola felicidades por tu pagina y por lo bien explicado que esta, mi pregunta es la siguiente ¿Como eliminar numero repetido en un vector? lo he estado intentando pero no he podido hacerlo ya intente crear un vector nuevo copiarlo lo que hice es q lo ordene de menor a mayor ,el vector lo lleno con numeros aleatorios que el mismo programa genera , aqui dejo parte de mi codigo ojala me pudieras decir mis errores. … //ordeno mi vector int tem,j,g=0,n[g]; for(i=0;i<20;i++) { for(j=i+1;j<20;j++) { if(c[j]<c[i]) { tem=c[j]; c[j]=c[i]; c[i]=tem; } } } //quito numeros iguales y los convierto cero for(i=0;i<20;i++) { for(j=i+1;j<20;j++) { if(c[i]==c[j]) { tem=c[j]; c[j]=c[i]; c[i]=0; } } }
  • 10. aqui imprimo el vector y si los numeros q se repiten me los marca con 0 lo pero me lo imprime asi por ejemplo : 0 1 0 2 0 8 0 9 lo que quiero hacer es mandar al final los ceros para q quede asi 1 2 8 9 0 0 0 0 y ya despues imprimir el vector 1 2 8 9 espero me puedas ayudar a darme una idea gracias.