В статье показывается сортировка массива двумя способами. Каждый способ оценивается на количество затраченного сортировкой времени.
#include <stdio.h> #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(); // Ожидание нажатия на кнопку } Первый способ будет быстрее. Были получены следующие результаты на сортировке 50000 элементов:
- Сортировка первым способом заняла 11786 мс.
- Сортировка вторым способом заняла 22953 мс.
Второй способ медленнее в ~1.9 раза! Так что делайте выводы, господа ;) |