public static int[] crossover(int[] orderA, int[] orderB) {
        // Get order length
        int length = orderA.length;
        
        // Early out if crossover would yield nothing
        if (length < 4) return orderA;

        // Determine random cut location and length
        int cutlength = 1 + (int)(Math.random() * (length - 2));
        int cutindex = 1 + (int)(Math.random() * (length - 1 - cutlength));
        
        // Create parent and child from given arrays      
        int[] parent = orderA.clone();
        int[] child = orderB.clone();
        
        // Loop through the parent and strikeout crossovers
        for(int i = 1; i < length-1; i++)
            for(int j = 0; j < cutlength; j++)
                if(parent[i] == child[cutindex + j])
                    parent[i] = -1;
        
        // Reloop through parent and add to child
        for(int i = 1, j = 1; i < length-1; i++) {
            if(j == cutindex)
                j += cutlength;
            
            if(parent[i] != -1)
                child[j++] = parent[i];
        }
        
        return child;
    }