Intercalación

Enunciado

Dados dos vectores ordenados en el mismo sentido, el proceso de intercalación consiste en obtener un vector igualmente ordenado, que contenga a todos los elementos de los vectores de entrada.

Video: Intercalación

Código

Python

def Merge( a , b):   
    c = []
    i = j = 0
    while i<len( a ) and j<len( b ):
        if a[i]<b[j]:
            c.append( a[i] )
            i += 1
        else:
            c.append( b[j] )
            j += 1
            
    if i==len( a ):
        for p in range ( j , len( b ) ):
            c.append( b[p] )
    else:
        for p in range ( i , len( a ) ):
            c.append( a[p] )
        
    return c

def main():
    l1 = [ 3, 12, 25, 36, 39 ]
    l2 = [ 2, 23, 27, 30 ]
    
    l3 = Merge( l1 , l2 )
        
    print( "\nListas intercaladas/Merged lists" )
    for i in l3:
        print( i )
    
    input( "Presionar/Press Enter to exit " )
main()

C++

#include <iostream>
using namespace std ;
#include <conio.h>

void Merge ( float a[ ] , float b[ ] , 
	     int n , int m , float c[ ] )
{
   int i , j , k , p ;

   i = 0 ; j = 0 ; k = 0 ;
   while ( i < n && j < m )
   {
      if ( a[i] <= b[j] )
        { c [k] = a[i] ; i++ ; }
      else
        { c[k] = b[j] ; j++ ; }
      k++ ;
   }
   if ( i == n )
      for ( p = j ; p < m ; p++ )
	 { c[k] = b[p] ; k++ ; }
   else
      for ( p = i ; p < n ; p++ )
         { c[k] = a[p] ; k++ ; }
}

int main()
{
   int  i ;
   float v1[ 10 ] , v2[ 10 ] , v3[ 10 ] ;

   cout << "Vector 1 - 5 elementos/elements" 
	<< endl ;
   for ( i = 0 ; i < 5 ; i++ )
	cin >> v1[i] ;

   cout << "Vector 2 - 4 elementos/elements" 
	<< endl ;
   for ( i = 0 ; i < 4 ; i++ )
	cin >> v2[i] ;

   Merge( v1 , v2 , 5 , 4 , v3 ) ;

   cout << "Vector intercalado/merged" << endl ;
   for ( i = 0 ; i < 5 + 4 ; i++ )
	cout << v3[i] ) ;

   cout << endl ;
   cout << "Presionar/Press Enter to exit " ;
   getch() ;
   return 0 ;
}

Pascal

program EjemploIntercalar ;
uses crt;

type
    rango= 1..20 ;
    v_int= array [ rango ] of integer ;

var
    v1 , v2 , v3: v_int ;
    cant3, i: rango ;

Procedure Merge( n , m: rango ; var a , b: v_int ; 
                 var c: v_int ) ;
var 
    i , j , k , p : rango ;
	
begin
    i := 1 ; j := 1 ; k := 1 ;
    while ( i <= n ) and ( j <= m ) do
    begin
	if a[ i ] <= b[ j ]
	then
        begin 
	    c[ k ] := a[ i ] ;
	    i := i + 1 
	end
        else
        begin 
	    c[ k ] := b[ j ] ;
            j := j + 1 
        end ;
	k := k + 1
    end ;
    if i > n
    then
	for p := j to m do 
	begin 
	    c[ k ] := b[ p ] ;
            k := k + 1 
	end
    else
	for p := i to n  do 
	begin 
	    c[ k ] := a[ p ] ;
            k := k + 1 
        end 
end ;

begin
    ClrScr;
    write( 'Vectores ordenados ascendente/' ) ;
    writeln( 'Vectors sorted ascending' ) ;
    writeln ;
   
    writeln( 'Vector 1 - 5 elementos/elements: ' ) ;
    for i:=1 to 5 do
    begin
        readln( v1[ i ] ) ;
    end;

    writeln( 'Vector 2 - 4 elementos/elements: ' ) ;
    for i:=1 to 4 do
    begin
        readln( v2[ i ] ) ;
    end;
	
    writeln( 'Vector intercalado/merged' ) ;
    Merge( 5 , 4 , v1 , v2 , v3 ) ;

    writeln ;
    for i:=1 to 5 + 4 do
    begin
        writeln( v3[ i ]:14 ) ;
        writeln ;
    end;
    
    writeln( 'Presionar/Press Enter to exit ' ) ;
    readln ;
end.

Diagramas