Сортировка элементов массива - сравнение двух способов
В статье показывается сортировка массива двумя способами. Каждый способ оценивается на количество затраченного сортировкой времени.
Второй способ медленнее в ~1.9 раза! Так что делайте выводы, господа ;)
#include <stdio.h>Первый способ будет быстрее. Были получены следующие результаты на сортировке 50000 элементов:
#include <time.h>
#include <stdlib.h>
#include <conio.h>
#include <math.h>
inline void Change(int a[], int first, int second)
// меняем местами элементы буфера first на second
// a[] - наш массив
// first и second - номера элементов массива a, которые надо поменять местами!
{
if (first == second) // Если одинаковые номера элементов, то не нужно менять их местами
return;
int i;
i = a[second];
a[second] = a[first];
a[first] = i;
/*
// Можно еще так вот, но так медленнее:
a[first] += a[second]; // Здесь,
a[second] = a[first] - a[second]; // здесь,
a[first] = a[first] - a[second]; // и здесь мы меняем местами два числа в буфере
*/
}
int FindMax(int a[], int max)
// Поиск максимального числа в массиве от a[0] до a[max]
// a[] - наш массив
// max - размер массива a
{
int imax = 0;
for (int i = 0; i <= max; i++)
{
if (a[imax] < a[i])
imax = i;
}
return imax;
}
void Sort(int b[], int max)
// Сортировка номер один!
// b[] - наш массив
// max - размер массива b
{
int i1;
for (int i = max - 1; i > 0; i--)
{
i1 = FindMax(b, i); // Находим самое максимальное число в промежутке от a[0] до a[i]
Change(b, i, i1); // ставим максимальное число в конец (а именно на место эллемента под номером i)
}
}
void Sort1(int c[], int max)
// Сортировка номер два!
// c[] - наш массив
// max - размер массива c
{
for (int i1 = 0; i1 < max; i1++)
{
for (int i = max-2; i >= i1; i--)
{
if (c[i+1] > c[i]) continue;
Change(c, i, i+1); // Двигаем минимальное число вверх, тем самым сортируя числа
}
}
}
void main()
{
#define MAX 100
int a[MAX], b[MAX], c[MAX]; // Объявляем пару буферов
/*
// Можно две строки выше записать еще и так, тогда у юзера будет запрашиваться размер буфера
int MAX;
printf("Enter the size of array with the numbers: ");
scanf("%i", &MAX);
int *a = new int[MAX]; // Объявляем буфер
int *b = new int[MAX]; // Объявляем буфер
int *c = new int[MAX]; // Объявляем буфер
*/
srand((unsigned)time(0));
for (int i = 0; i < MAX; i++)
{
a[i] = rand(); // заполняем случайными числами
b[i] = a[i]; // делаем копию
c[i] = a[i]; // делаем копию
}
clock_t begin, end;
begin = clock();
Sort(b, MAX); //
end = clock();
float f = (float)(end-begin); // Измеряем время, занятое сортировкой
printf ("Sorting %i elements with the sort number 1 takes %.0f msec.\r\n\r\n", MAX, f);
begin = clock();
Sort1(c, MAX); //
end = clock();
float f1 = (float)(end-begin); // Измеряем время, занятое сортировкой
printf ("Sorting %i elements with the sort number 2 takes %.0f msec.\r\n", MAX, f1);
// Вы хотите просмотреть отсортированные данные?
printf("\r\n\r\n\r\nDo you really want to view the sorting result? (y/n)");
short Key = 0;
while (Key = _getch()) // Ожидание нажатия на кнопку
{
if (Key == 'n' || Key == 'N' || Key == 27) // если нажата кнопк N или Esc, то
return; // выход
else if (Key == 'y' || Key == 'Y') // если y, то
break; // то продолжаем
}
printf("\r\n\r\n\r\n");
printf(" N. unsorted N. 1-st sort N. 2-nd sort\r\n");
printf("\r\n");
for (i = 0; i < MAX; i++)
printf("%3i. %5i %3i. %5i %3i. %5i\r\n",
i+1, a[i], i+1, b[i], i+1, c[i]); // Печать содержимого массивов
printf("\r\nPress any key to continue\r\n");
Key = 0;
while (!Key) Key = _getch(); // Ожидание нажатия на кнопку
}
- Сортировка первым способом заняла 11786 мс.
- Сортировка вторым способом заняла 22953 мс.
Второй способ медленнее в ~1.9 раза! Так что делайте выводы, господа ;)