سلام.دوست عزیز اول خدمتتون عرض کنم که کل این کار رو با چند خط کد ساده میشه انجام داد و نیازی به پیچیده کردن کار نیست :
var z = new int[x.Length + y.Length];
x.CopyTo(z, 0);
y.CopyTo(z, x.Length);
Array.Sort(z);
x : آرایه اول
y : آرایه دوم
z : آرایه کلی(ادغام شده)
اما در مورد سوالاتون ،
i در واقع نقش شماره ایندکس آرایه کلی(ThirdArray) رو بازی میکنه.فرض کنید آرایه اول 5 عنصر و آرایه دوم 7 عنصر داره.توی for اول 5 عنصر به ThirdArray اضافه میشن.توجه داشته باشید که i بیرون حلقه اول تعریف شده تا در ادامه هم بشه ازش استفاده کرد.توی for بعدی 7 عنصر آرایه دوم اضافه میشن که طبعا باید به 5 عنصر قبلی اضافه بشن.یعنی از عنصر ششم تا دوازدهم آرایه ThirdArray.واسه همین i یه دونه یه دونه زیاد میشه تا عناصر آرایه دوم توی خونه های ششم(ایندکس 5) تا دوازدهم(ایندکس 11) بشینن.
در مورد sum-1 : این بخش کد که دو تا for تودرتو هست در واقع کار مرتب سازی رو انجام میده(روش مرتب سازی حبابی که یه الگوریتم رایج برای مرتب سازی هست).
به طور کلی ، توی این حلقه ها ، هر عنصر با عنصر بعدیش مقایسه میشه (به خط if داخل for دوم دقت کنید) و بر حسب نوع مرتب سازی(صعودی یا نزولی) در صورت نیاز(کوچکتر یا بزرگتر بودن) با هم جابجا میشن و اینکار تکرار میشه تا در نهایت آرایه به طور کامل مرتب بشه.
اگه حلقه دوم بخواد تا sum پیش بره به جایی میرسه که میخواد عنصر آخر رو با عنصر بعدیش مقایسه کنه!!!!! مثلا اگه ThirdArray دارای 12 عنصر باشه ، میخواد عنصر دوازدهم رو با عنصر سیزدهم که اصلا وجود نداره مقایسه کنه و بالطبع خطای "ایندکس بیرون از محدوده" خواهد داد.
اگر هم هر مقداری کمتر از sum-1 بهش بدید(sum -2 یا sum -3 یا ...) باعث میشه مرتب سازی به طور کامل انجام نشه(البته بسته به مقادیر موجود در آرایه ،گاهی درست عمل خواهد کرد.اما از لحاظ الگوریتمیک ، 100% صحیح نخواهد بود)
پ.ن : اگر در if ذکر شده ، شرط =< رو به < تغییر بدید ، الگوریتم بهینه تر خواهد شد.