C/Visual C - Intersección y ordenamiento de Arreglos

 
Vista:
sin imagen de perfil

Intersección y ordenamiento de Arreglos

Publicado por Sebastián (31 intervenciones) el 27/11/2016 21:13:50
Hola!, saludos con toda la comunidad, me gustaría que me sepan ayudar con el siguiente ejercicios, ando algo confundido, puesto que no se como intersecar el arreglo A y B en un Arreglo C ordenado, sin utilizar ningun algoritmo de ordenamiento como el burbuja, etc.
Además que no se si sea un ejercicios de arreglos dinámicos.
Agradezco mucho sus comentarios o directrices para poderlo llevar a cabo.
El enunciado es el siguiente:

"Elaborar un programa que intercale ascendentemente dos arreglos, el arreglo a y el arreglo b, los arreglos intercalados deben quedar en el arreglo c. El número de elementos del arreglo a es m y el número de elementos del arreglo b es n, m y n deben ser menores de 100.

El proceso se debe efectuar en la medida en que se vayan almacenando los elementos del arreglo c; intercalándose ascendentemente, evitando de esta manera realizar un método de ordenamiento del arreglo c.

El programa debe leer los arreglos y escribir el contenido de cada uno de ellos luego del proceso."

Gracias de antemano.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil

Intersección y ordenamiento de Arreglos

Publicado por Diego (150 intervenciones) el 29/11/2016 14:36:31
¿Podrías proporcionarnos un código el cual analizar?.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 296
Bronce
Ha mantenido su posición en C/Visual C (en relación al último mes)
Gráfica de C/Visual C

Intersección y ordenamiento de Arreglos

Publicado por agustin (272 intervenciones) el 29/11/2016 15:03:40
Yo de ese proceso tengo un par de dudas.
Cuando dice que se van intercalando ¿se refiere a intercalar los en el arreglo en la posición que le toque aunque yo vayan juntos ambos datos? ¿o se refiere a ir intercalando los al estilo ababab...
Si es el primero eso SÍ es un método de ordenación y se llama ordenación por inserción. En realidad lo podrías combinar con el método binario para que sea más eficiente ya que combinarlo con el de burbuja con arreglos muy grandes seria poco eficiente ya que tendrías que comparar el valor a insertar con todos hasta encontrar su posición.
Para lo que te piden también seria ideal usar memoria dinámica ya que a la hora de intercalar el nuevo valor solo habría que cambiar los valores de los punteros mientras que con memoria estática tendrías que reescribir todos los valores desde la posición en la que insertes hasta el último valor del arreglo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Intersección y ordenamiento de Arreglos

Publicado por Sebastián (31 intervenciones) el 29/11/2016 19:45:26
Hola, Agustín gracias por su ayuda, la verdad he estado intentándolo pero ando algo confundido porque ni mi profesor me ha sabido dar una explicación muy clara para proceder a resolver al problema, en la parte final pensaba usar burbuja pero como dice que no se debe emplear ningun método de ordenamiento, me nublo más la idea que tenía para resolver el problema.

En cuestión al arreglo dinámico debería emplearlo en el arreglo C?, para ir intercalando los valores del arreglo A y B?

Muchas gracias por tu ayuda y tiempo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 296
Bronce
Ha mantenido su posición en C/Visual C (en relación al último mes)
Gráfica de C/Visual C

Intersección y ordenamiento de Arreglos

Publicado por agustin (272 intervenciones) el 30/11/2016 08:01:03
Sí en el C.
Con respecto a no usar ningún método de ordenación creo que se refiere a que no se puede usar al final para ordenar C ya que mientras vas insertando elementos tienes que ordenar si o si y ya te dije el modo más eficiente.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 296
Bronce
Ha mantenido su posición en C/Visual C (en relación al último mes)
Gráfica de C/Visual C

Intersección y ordenamiento de Arreglos

Publicado por agustin (272 intervenciones) el 01/12/2016 14:26:36
Prueba esto que codee a ver si hace lo que quieres y si no ya tienes una base:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
#include <stdio.h>
#include <stdlib.h>
 
#define NARRAYS 4
 
int buscarPos(int valor, int array[], int nElementos);
int insertarElemento(int valor, int array[], int nElementos, int pos);
int obtenerIndice(int index, int valIni, int valFin);
 
int main(int argc, char* argv[])
{
    //Esta es usada como contador para los bucles FOR
    int i;
 
    //Estas son los arrays que queremos pasar ordenados a un solo array
    //Tiene que ser intercalandolos, o sea primero uno del a, luego uno del b,
    //luego otro del c...
    int a[]={50,2,11,55,3,1,7,9};
    int b[]={4,2,6,10,8};
    int c[]={9,8,7,15};
    int d[]={56,44,22,33,88,66,77,99};
 
    //Puntero para el array dinamico que contendrá todos los elementos ordenados
    int *ordenados;
 
    //Usada para guardar en el la posicion en la que hay que insertar el elemento
    int pos;
 
    //Contador del numero de elementos insertados
    int nElements=0;
 
    //Esta variable es necesaria para saber a que array le tocará insertar
    int balanceo=0;
 
    //Arrays usados para almacenar los valores o punteros a las variables
    //necesarias para el balanceo entre los arrays
    int contador[NARRAYS],*parray[NARRAYS],size[NARRAYS],sizeTotal=0;
 
    //Las inicializo con los valores y direcciones iniciales
    parray[0]=a;
    parray[1]=b;
    parray[2]=c;
    parray[3]=d;
 
    size[0]=sizeof(a)/sizeof(int);
    size[1]=sizeof(b)/sizeof(int);
    size[2]=sizeof(c)/sizeof(int);
    size[3]=sizeof(d)/sizeof(int);
 
    //Obtengo el total de elementos que debe contener el array dinamico
    for(i=0; i<NARRAYS; sizeTotal += size[i++]);
 
    //Inicializo los contadores
    for(i=0; i<NARRAYS; contador[i++]=0);
 
    //Solicito la memoria necesaria para colocar la lista combinada ordenada
    ordenados = calloc(sizeTotal ,sizeof(int));
 
    while(nElements < sizeTotal){
        if(contador[balanceo] < size[balanceo]){
            //Obtengo la posicion que tomará dicho elemento en la lista en orden ascendente
            pos = buscarPos(parray[balanceo][contador[balanceo]],ordenados,nElements);
            //Inserto el elemento en dicha posicion
            nElements = insertarElemento(parray[balanceo][contador[balanceo]],ordenados,nElements,pos);
            contador[balanceo]++;
        }
        balanceo=obtenerIndice(balanceo,0,3);
    }
 
    for(pos=0;pos<nElements;pos++)
        printf("%i\n",ordenados[pos]);
    free(ordenados);
    getchar();
    return 0;
}
//---------------------------------------------------------------------------
 
int buscarPos(int valor, int array[], int nElementos)
{
    //Esta la uso como indice para posicionarme en el elemento del array
    //Empiezo comparando con el ultimo elemento por lo que lo inicializo para ello
    int pos=nElementos-1;
 
 
    int aux_pos; //La uso para saber si al dividir me da el mismo indice
    int pos_ini=0; //Contendra el indice inicial desde el que buscar
    int pos_fin=pos; //Contendra el indice final hasta donde buscar
 
    //En este condicional solo entro si el numero de elementos es mayor que 0
    //ya que si vale 0 solo tengo que colocarlo en la primera posicion
    if(nElementos > 0)
    {
        do{
            aux_pos=pos;
            if(valor > array[pos]){
                //Si entro aqui quiere decir que todos los elementos del array
                //hasta la posicion indicada en el indice son menores con lo que
                //la posicion inicial pasa a ser la posicion indicada por pos
                pos_ini = pos;
 
                //Obtengo el indice del centro entre la posicion inicial y la final
                pos = pos_ini + (pos_fin - pos_ini) / 2;
 
                //Si el valor es mayor que el de la posicion del array y se
                //cumple el siguiente condicional hay que incrementar en 1 la
                //posicion ya que solo hay que pasar esa posicion para que quede
                //en el sitio correcto
                if(aux_pos == pos){
                    pos++;
                    break;
                }
            }else if(valor < array[pos]){
                //Si entro aqui es porque todos los elementos del array desde la
                //posicion indicada hasta el final del array son mayores que el
                //valor buscado con lo que la posicion final pasa a ser la
                //posicion indicada por pos
                pos_fin = pos;
 
                //Obtengo el indice del centro entre la posicion inicial y la final
                pos = pos_ini + (pos_fin - pos_ini) / 2;
            }
        }while(aux_pos != pos);
    }else{
        pos=0;
    }
    return pos;
}
//---------------------------------------------------------------------------
 
int insertarElemento(int valor, int array[], int nElementos, int pos)
{
    int i;
 
    //Si hay que intercalar un elemento desplazo todos los que esten a partir de
    //esa posicion hacia el siguiente elemento a la derecha
    for (i=nElementos; i > pos; i--) {
        array[i]=array[i-1];
    }
    //Coloco el elemento en el lugar que le corresponde
    array[pos]=valor;
 
    nElementos++;
    return nElementos;
}
//---------------------------------------------------------------------------
 
//Obtengo el indice usando el balanceo deseado en este caso
int obtenerIndice(int index, int valIni, int valFin)
{
    index++;
    if(index > valFin)
        index=valIni;
    return index;
}
//---------------------------------------------------------------------------
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar