Вот простое сравнение массива случайных значений в виде пузырьков и гномов, значений в обратном порядке, 3 объединенных массивов упорядоченных значений и упорядоченных значений.Сортировка гномов в среднем кажется немного дешевле с точки зрения сравнения.
Обратите внимание, что сравнения / свопы при сортировке случайных значений всегда немного отличаются, но близки к этим результатам.
N = 100, попыток = 1000
в случайном порядке:
пузырьковая сортировка: сравнения = 8791794, обмены = 2474088
сортировка гномов: сравнения = 5042930, обмены = 2474088
в обратном порядке:
пузырьковая сортировка: сравнения = 9900000, обмены = 4950000
сортировка гномов: сравнения = 9900000, обмены = 4950000
3 упорядоченных набора:
пузырьковая сортировка: сравнения = 6435000, свопы = 1584000
сортировка гномов: сравнения = 3267000, обмены = 1584000
упорядочено:
пузырьковая сортировка: сравнения = 99000, swaps = 0
сортировка гномов: сравнение = 99000, swaps = 0
... И вот код, используемый для получения этих результатов:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
const int N = 100;
int x[N];
int main()
{
srand((unsigned int)time(0));
int comparisons = 0;
int swaps = 0;
int attempts = 1000;
while (--attempts >= 0)
{
// random:
for (int i = 0; i < N; ++i)
x[i] = rand();
// reversed:
/*for (int i = 0; i < N; ++i)
x[i] = N - 1 - i;*/
// 3 ordered sets:
/*for (int i = 0; i < N/3; ++i)
x[i] = i;
for (int i = N/3, j = 0; i < 2*N/3; ++i, ++j)
x[i] = j;
for (int i = 2*N/3, j = 0; i < N; ++i, ++j)
x[i] = j;*/
// ordered:
/*for (int i = 0; i < N; ++i)
x[i] = i;*/
// bubble sort:
/*{
bool swapped;
do
{
swapped = false;
for (int i = 0; i < (N - 1); ++i)
{
++comparisons;
if (x[i] > x[i + 1])
{
++swaps;
int t = x[i];
x[i] = x[i + 1];
x[i + 1] = t;
swapped = true;
}
}
} while (swapped);
}*/
// gnome sort:
{
int i = 1;
while (i < N)
{
++comparisons;
if (x[i] >= x[i - 1])
++i;
else
{
++swaps;
int t = x[i];
x[i] = x[i - 1];
x[i - 1] = t;
if (i > 1)
--i;
}
}
}
}
printf("comparisons = %d\n", comparisons);
printf("swaps = %d\n", swaps);
}
Очевидноэто далеко не полный тест, но он дает представление.