Fusione di 2 array

A partire da due sequenze ordinate, v1 e v2, si vuole realizzare una terza sequenza ordinata v3.

public static double[] merge(double v1[], double v2[])
{
   int i1=0, n1=v1.length,
       i2=0, n2=v2.length,
       i3=0, n3=n1+n2;

   double v3[] = new double[n3];

   while(i1 < n1 && i2 < n2)
   {
      if(v1[i1] <= v2[i2])
      {
         v3[i3]=v1[i1];
         i1++;
      }
      else
      {
         v3[i3]=v2[i2];
         i2++;
      }
      i3++:
   }
   while(i1 < n1)
   {
      v3[i3]=v1[i1];
      i1++;
      i3++;
   }
   while(i2 < n2)
   {
      v3[i3]=v2[i2];
      i2++;
      i3++;
   }
   return v3;
}

Supponiamo che l'array v contenga due sottoarray adiacenti ordinati (v' da inf a medio e v'' da medio+1 a sup).
Si può adattare il codice precedente in modo che i dati siano copiati, in ordine, su un array temporaneo e poi ricopiati su v, da inf a sup

public static void merge2(double v[], int inf, int medio, int sup)
{
   int i1=inf,
       i2=medio+1,
       i3=0;
   double[] v3 = new double[sup-inf+1];

   while(i1 <= medio && i2 <= sup)
   {
      if(v[i1] <= v[i2])
      {
         v3[i3]=v[i1];
         i1++;
      }
      else
      {
         v3[i3]=v[i2];
         i2++;
      }
      i3++;
   }
   while(i1 <= medio)
   {
      v3[i3]=v[i1];
      i1++;
      i3++;
   }
   while(i2 <= sup)
   {
      v3[i3]=v[i2];
      i2++;
      i3++;
   }
   for(int i=inf; i <= sup; i++)
      v[i]=v3[i-inf];
}