Количество обменов и сравнений в сортировке Shaker/Cocktail - Java

Я рассмотрел, как подсчитывать обмены и сравнения для пузырьковой сортировки, и изменил программу сортировки в шейкере следующим образом:

 public void shakerSort(int a[])  // http://www.geeksforgeeks.org/cocktail-sort/
{
    boolean swapped = true;
    comparisons = 0;
    swaps = 0;
    int start = 0;
    int end = a.length;

    while (swapped==true)
    {         
        swapped = false;

        for (int i = start; i < end-1; ++i)
        {
          comparisons++; //count comparisons
          if (a[i] > a[i + 1])
          {
             int temp = a[i];
             a[i] = a[i+1];
             a[i+1] = temp;
             swapped = true;

             swaps++; //count swaps
          }
        }

        if (swapped==false)
        {
            break; 
        }

        swapped = false;

        end = end-1;

        for (int i = end-1; i >=start; i--)
        {
          comparisons++; //count comparisons
            if (a[i] > a[i+1])
            {
                int temp = a[i];
                a[i] = a[i+1];
                a[i+1] = temp;
                swapped = true;
                swaps++; //count swaps
            }
        }

        start = start+1;

    }

}

Однако для массива из 100 элементов, где количество сравнений всегда должно быть 4950 ( n(n-1)/2 ), это дает мне значение, которое меняется каждый раз, когда я запускаю программу, и это значение всегда меньше 4950. .

Почему это происходит, и как я могу это исправить?

(ПРИМЕЧАНИЕ: массив рандомизируется при каждом запуске программы)

Кроме того, количество свопов в порядке?


person TheDeadline    schedule 03.12.2017    source источник
comment
Вы даете тот же массив в качестве ввода?   -  person Jay Joshi    schedule 03.12.2017
comment
Это всегда один и тот же размер, но каждый раз он рандомизируется по-разному. Это повлияет на это?   -  person TheDeadline    schedule 03.12.2017
comment
да, может быть дело.! видите, вы дали петлю, while(swap) сейчас, это ДОЛЖНО быть причиной отклонения в счете. подумайте, если переменные не поменялись местами и ваш swap не изменился на true. следовательно, это false. так что в этом случае программа не будет зацикливаться. Это единственная причина для разных счетов. Я не уверен в логике сортировки. но этот цикл точно вносит все изменения.   -  person Jay Joshi    schedule 03.12.2017
comment
Хм, я вижу, но я не знаю, как это исправить тогда...   -  person TheDeadline    schedule 03.12.2017
comment
Ничего не исправить. Все верно. Я проверяю алгоритм. и ваш код идеален. Вам просто нужно принять, что количество итераций будет разным для каждого входа. поэтому счет будет другим. Также swap счет тоже идеален.!   -  person Jay Joshi    schedule 03.12.2017
comment
О, тогда это прекрасно! Благодарю вас!   -  person TheDeadline    schedule 03.12.2017
comment
Давайте продолжим обсуждение в чате.   -  person Jay Joshi    schedule 03.12.2017


Ответы (1)


Давайте возьмем пример и поймем изменения в счете:

массив [5] = {2, 1, 3, 4, 5}

Сколько итераций это должно занять?

сначала сортировка шейкером будет проверяться с начала, а затем с последнего на каждой итерации. count равно 0 в начале.

 2 , 1 , 3 , 4 , 5 --> count = 1
 ^   ^
 it will swap 2 and 1
 swap count++

 1 , 2 , 3 , 4 , 5  --> count = 2
             ^   ^
 no swap

программа снова проверит, потому что swap = true

 1 , 2 , 3 , 4 , 5 --> count = 3
     ^   ^
  no swap

 1 , 2 , 3 , 4 , 5  --> count = 4
         ^   ^
 no swap

программа завершится, потому что сейчас swap = false.


Теперь давайте возьмем другой массив:

массив [5] = { 5 , 4 , 3 , 2 , 1 }

для того же, итераций будет намного больше, чем 4 итерации.!


Следовательно, для массива одного размера и другого значения количество итераций будет другим.!

Примечание: количество свопов и количество итераций в программе используются идеально :)

person Jay Joshi    schedule 03.12.2017
comment
Большое спасибо. Это очень помогло! :ДД - person TheDeadline; 04.12.2017