چطور میشه بعد مرتب سازی دیگه از تکرار بیش از اندازه جلوگیری کنه.........یعنی دیگه برنامه ادامه نده به کارش؟
تو این الگوریتم تو هر مرحله اجرا فقط یکی از عناصر آرایه به جای درست انتقال پیدا میکنن. و در مرحله بعد اون اعداد دیگه بررسی نمیشن و فقط اعدادی که مرتب نشده هستن بررسی میشن.
مثلا اعداد زیر رو در نظر بگیرید:
9و7و5و1و2و3و4
بعد از اولین اجرا به شکل زیر مرتب میشه:
7و 5 و 1 و 2 و 3 و 4 و 9
در مرحله بعد عدد 9 که در جای صحیح خودش قرار گرفته دیگه اصلا جزئ محاسبات نمیاد.
5 و 1 و 2 و 3 و 4 و 7 و 9
پس همونطور که میبینید اعدادی که مرتب میشن دیگه جزئ محاسبات نیست. ولی در بعضی حالات قبل از اینکه کلیه ی مراحل انجام بشه دیگه آرایه ی ما مرتب میشه و نیازی نیست که برنامه ادامه پیدا کنه. در چینن مواردی راه حل رو دوستمون گفتن فقط یه اشکال کوچولو وجود داره و اون اینکه شرط رو باید بیرون حلقه داخلی چک بشه نه داخل یعنی اینکه شما آرایه زیر رو در نظر بگیر:
1 و 2 و 3 و 5 و 4 و 6
طبق فرموده دوستمون در همون بار اول اجرا چون نیازی به جابجایی بین 1 و 2 نیست فلگی که گفتن به 0 ست شده و برنامه تموم میشه.
راه بهتر اینه که شما یه شمارنده تو حلقه داخلی قرار بدی و بعد از هر بار جابجایی به مقدار اون یکی اضافه کنید. حالا بعد از اجرای حلقه داخلی اگر مقدار شمارنده صفر بود یعنی هیچ عددی برای جابجایی وجود نداشت میتونی به ادامه برنامه خاتمه بدی.
void bubble_sort ( int arr [ ] , int n )
{
int temp , counter ;
for (int i = n - 2 ; i >= 0 ; i -- )
{
counter = 0 ;
for ( int j = 0 ; j <= i ; j ++ )
{
if ( arr [ j ] > arr [ j + 1 ] )
{
temp = arr [ j ] ;
arr [ j ] = arr [ j + 1 ] ;
arr [ j + 1 ] = temp;
counter ++ ;
}
}
if ( c == 0 )
break ;
}
}
موفق باشید.