Is it as good? COMPARE IT TO THE ANALYTICAL SOLUTION! We have gone through exactly this before.
A big problem however, is you are using the WRONG step size. That is, if you have
t = [0:tmax];
then your step size is 1. ONE. Do you see that? If you do that, then h must be 1. NOT 0.1. I'll use a step size of 0.1 though, which means I need to set t properly.
Next, you set the loop for Runge-Kutta to go from 1 to tmax. But the other loops went from 1 to L.
n_t = dsolve(diff(n,1) == n - c*n^2,n(0) == 0.1)
n_t =

nfun = matlabFunction(n_t)
nfun =
@(t)(exp(t).*2.0)./(exp(t)+1.9e+1)
That is the analytical solution. I'll strip out some of what you have written and solve lt for one initial value.
EulerN(1,j+1) = EulerN(j) + h*f(':',EulerN(j));
ImpN(1,j+1) = ImpN(j) + 0.5*h*( f ( t(j), ImpN(j) ) + f ( t(j+1), ImpN(j) + h * f ( t(j), ImpN(j) ) ) );
K2 = f(t(j) + h*0.5, RKN(j) + h*K1*0.5);
K3 = f(t(j) + h*0.5, RKN(j) + h*K2*0.5);
K4 = f(t(j) + h, RKN(j) + h*K3);
RKN(j+1) = RKN(j) + h*((K1 + K4)/6 + (K2 + K3)/3);
plot(t,N,'k-',t,EulerN,'g-',t,ImpN,'b-',t,RKN,'r-')
legend({'True solution','Simple Euler','Improved Euler','Runge - Kutta'},'Location','Southeast')
plot(t,N - EulerN,'g-',t,N - ImpN,'b-',t,N - RKN,'r-')
legend({'Simple Euler','Improved Euler','Runge - Kutta'},'Location','Northeast')
You should see that now, in the first plot, ALL of the curves pretty much lie on top of each other, now that I used comparable step sizes, etc. The problem is, you can't really see the difference. BUT in the error plot, how do they compare?
You should then see that simple Euler is ok, but it is way worse than improved Euler, and Runge-Kutta pretty much nails it, and does so far better than did either version of Euler. You really need to compare the methods using the same step sizes though. Else you will get meaningless, uninterpretable garbage.
You really need to learn to be more careful in your code. Otherwise, how can you trust the results you get?