Сортиране чрез пряка размяна

(метод на мехурчето)

 

При този метод на сортиране се сравняват всеки два съседни елемента и ако елементът с по-малък индекс има по-голяма стойност, местата им се разменят. Сравнението започва от последния към първия елемент на масива. При първото обхождане най-малкия елемент “изплува” на първо място в масива. При второто обхождане следващият по-големина елемент изплува и застава на втора позиция в масива. И така след n-1 обхождания масивът е подреден във възходящ ред.

Пример

Първо обхождане

i=0

44

44

44

44

44

44

44

 6

i=1

55

55

55

55

55

55

6

44

i=2

12

12

12

12

12

6

55

55

i=3

42

42

42

42

6

12

12

12

i=4

94

94

94

6

42

42

42

42

i=5

18

18

6

94

94

94

94

94

i=6

6

6

18

18

18

18

18

18

i=7

67

67

67

67

67

67

67

67

 

Второ обхождане

i=0

 6

6

6

6

6

6

6

i=1

44

44

44

44

44

44

12

i=2

55

55

55

55

55

12

44

i=3

12

12

12

12

12

55

55

i=4

42

42

42

18

18

18

18

i=5

94

94

18

42

42

42

42

i=6

18

18

94

94

94

94

94

i=7

67

67

67

67

67

67

67

 

Трето обхождане

i=0

 6

6

6

6

6

6

i=1

12

12

12

12

12

12

i=2

44

44

44

44

44

18

i=3

55

55

55

55

18

44

i=4

18

18

18

18

55

55

i=5

42

42

42

42

42

42

i=6

94

67

67

67

67

67

i=7

67

94

94

94

94

94

 

 

Четвърто  обхождане

i=0

 6

6

6

6

6

i=1

12

12

12

12

12

i=2

18

18

18

18

18

i=3

44

44

44

44

42

i=4

55

55

55

42

44

i=5

42

42

42

55

55

i=6

67

67

67

67

67

i=7

94

94

94

94

94

Пето  обхождане

i=0

 6

6

6

6

i=1

12

12

12

12

i=2

18

18

18

18

i=3

42

42

42

42

i=4

44

44

44

44

i=5

55

55

55

55

i=6

67

67

67

67

i=7

94

94

94

94

Шесто  обхождане

i=0

 6

6

6

i=1

12

12

12

i=2

18

18

18

i=3

42

42

42

i=4

44

44

44

i=5

55

55

55

i=6

67

67

67

i=7

94

94

94

Седмо  обхождане

i=0

 6

6

i=1

12

12

i=2

18

18

i=3

42

42

i=4

44

44

i=5

55

55

i=6

67

67

i=7

94

94

 

 

Обхождането винаги започва от последния елемент.

За алгоритмичното решаване на задачата е необходимо да се организират 2 цикъла: външен цикъл, който да следи границата на подредения подмасив и вътрешен, в който да се извършва сравняването и размяната на елементите. Външния цикъл се контролира от стойността на индексната променлива i, която съдържа крайния индекс на подредената част на масива (началният е винаги 0- първия елемент на масива). Променливата i се мени от 0 до n-2. (Не забравяйте, че максималният индекс на масива е n-1.) Ако всичките n-1 елемента са подредени, следва, че и n-тия елемент е на мястото си.

Вътрешния цикъл се контролира от стойността на променливата j. В него се извършва сревнение и евентуална размяна на елементите с индекси j и j -1. Стойността на променливата j се мени в границите от n-1(последния елемент от масива) до i+1 (началния индекс на неподредения подмасив).

Размяната на стойностите на елементите се изпълнява в три стъпки. За целта се използва помощната променлива pom.

Блоковата схема на алгоритъма за сортиране по метода на мехурчето е показана на фиг.3, а програмата – на листинг 2.

Гранични случаи:

1.      Първо обхождане: i=0

-         начало на вътрешния цикъл - сравняват се n-1-вия и n-2-рия елемент.

-         край на вътрешния цикъл - сравняват се i-тия с i-1-вия елемент на масива, т.е. елемента с индекс 1 и елемента с индекс 0.

Ако в условието за край на вътрешния цикъл беше записано j>=i вместо j>i, то щяха да се сравняват елементи с индекси 0 и -1, което е недопустимо.

2.      Последно обхождане - i=(n-2). Вътрешния цикъл има само едно завъртане. Сравняват се елементите с индекси (n-2) и (n-1) - предпоследния и последния елемент от масива.

Външния цикъл можеше да има условие за изпълнение (i<n), но тогава при последното завъртане вътрешния цикъл не би се изпълнил нито веднъж. Началната стойност за j щеше да е j=n-1 и условието j>i (i=n-2) нямаше да е изпълнено.

 

 

 

 

 

 

 


                                    

 

 

 

 

 

 

 

 

 

 

 

 

 

                                                                                        

 

//Листинг 2


# include <iostream.h>

void input(float a[100], int &n)

{

  int i;

  cout<<"n=";

  for(i = 0; i<n;i++)

  {

      cout<<"a["<<i<<"]=";

      cin>>a[i];

  }

}

void output (float a[100], int n)

{

  int i;

  for(i=0;i<n;i++)

  {

       cout<<a[i]<<'\t';

  }

}

 

void sort(float a[100], int n)

{ 

    int i,j;

    float x;

    for(i=0;i<n-1;i++)

    { 

       for(j=n-1;j>i;j--)

       { 

          if(a[j]<a[j-1])

          { 

             x=a[j];

             a[j]=a[j-1];

             a[j-1]=x;

           }

        }

    }

}

 

void main(void)

{

            int n;

            float a[100];

            input (a,n) ;

    sort (a,n) ;

    output (a,n) ;

}