Я рассмотрел, как подсчитывать обмены и сравнения для пузырьковой сортировки, и изменил программу сортировки в шейкере следующим образом:
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. .
Почему это происходит, и как я могу это исправить?
(ПРИМЕЧАНИЕ: массив рандомизируется при каждом запуске программы)
Кроме того, количество свопов в порядке?
while(swap)
сейчас, это ДОЛЖНО быть причиной отклонения в счете. подумайте, если переменные не поменялись местами и вашswap
не изменился наtrue
. следовательно, этоfalse
. так что в этом случае программа не будет зацикливаться. Это единственная причина для разных счетов. Я не уверен в логике сортировки. но этот цикл точно вносит все изменения. - person Jay Joshi   schedule 03.12.2017swap
счет тоже идеален.! - person Jay Joshi   schedule 03.12.2017