FAQ по C/C++/Visual C++
![]() Работа с сетью![]() ![]() Сортировка эллементов массива![]() ![]() ![]() Вариант 1 и 2 |
Составители: SUnteXx, Leprecon |
| Сортировка эллементов массива | |||
|
Вариант 1 и 2 В данной примере показывается сортировка массива двумя способами. Каждый способ замеряется на количество затраченного сортировкой времени. #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 эллементов! 1 способ. Сортировка заняла 11786 мс. 2 способ. Сортировка заняла 22953 мс. Как-никак второй способ медленнее в ~1.9 раза, что не есть хорошо! Так что юзайте первый способ и все будет хорошо. Вот еще способ сортировки: /*************************************************/
/* PERFORM SORTING USING BUBBLE METHOD */
/*************************************************/
// Bubble сортировка
void sortbubble(long num, float *array)
// num - число эллементов
// array - указатель на первый эллемент массива
{
// Sorting using well-known bubble method
short sorted = 1; //flag, 0 - array not sorted, 1 - sorted
short changed = 0; //flag, at least one pair was switched
float temp;
do
{
changed = 0;
for (long i = 0; i < num - 1; i++)
{
if (array[i] > array[i+1])
{
temp = array[i];
array[i] = array[i+1];
array[i+1] = temp;
changed = 1;
}
}
sorted = !changed;
} while (!sorted);
}Еще способ сортировки:/*************************************************/
/* PERFORM SORTING USING MINIMA METHOD */
/*************************************************/
//also known as most "natural" sorting method
// Minima сортировка
void sortminima (long num, float *array)
// num - число эллементов
// array - указатель на первый эллемент массива
{
long k,s,t;
k = 0;
float temp;
while (k < num)
{
s = k;
t = s;
while (t < num-1)
{
t++;
if (array[t] < array[s]) s = t;
}
temp = array[s];
array[s] = array[k];
array[k] = temp;
k++;
}
}И еще способ сортировки:/*************************************************/
/* PERFORM SORTING USING SIMPLE INCLUSION METHOD */
/*************************************************/
//taken from alglib block scheme.
// Simple Inclusion сортировка
void sortsimpinc(long num, float *array)
// num - число эллементов
// array - указатель на первый эллемент массива
{
long i,j,k;
float temp;
i = 1;
do
{
j = 0;
do
{
if (array[i] <= array [j])
{
k = i;
temp = array[i];
do
{
array[k] = array[k-1];
k--;
} while (k > j);
array[j] = temp;
j = i;
}
else j++;
} while (j < i);
i++;
} while (i < num);
}И еще способ сортировки:/*************************************************/
/* PERFORM SORTING USING BINARY INCLUSION METHOD */
/*************************************************/
//taken from alglib block scheme
// Binary Inclusion сортировка
void sortbininc(long num, float *array)
// num - число эллементов
// array - указатель на первый эллемент массива
{
long i, b, e, c, k;
float temp;
i = 1;
do
{
b = 0;
e = i - 1;
c= (b + e)/2;
while (b != c)
{
if (array[c] > array[i]) e=c; else b=c;
c = (b + e)/2;
}
if (array[b] < array[i])
if (array[i] > array[e]) b = e + 1; else b = e;
k=i;
temp = array[i];
while (k > b)
{
array[k] = array[k-1];
k--;
}
array[b] = temp;
i++;
} while (i < num);
}Вот еще способ сортировки:/*************************************************/
/* PERFORM SORTING USING SHELL METHOD */
/*************************************************/
//taken from alglib block scheme
// Shell сортировка
void sortshell (long num, float *array)
// num - число эллементов
// array - указатель на первый эллемент массива
{
long i,j,g;
short c; //flag
float temp;
g = num/2;
do
{
i = g;
do
{
j = i - g;
c = 1;
do
{
if (array[j] <= array[j+g]) c = 0;
else
{
temp = array[j];
array[j] = array[j+g];
array[j+g] = temp;
}
j--;
} while(j >= 0 && c);
i++;
} while(i < num);
g = g/2;
} while(g > 0);
}Кто знает еще способы сортировки массивов, шлите мне сорсы на SUnteXx@pisem.net!
| |||
|
|
FAQ составлен по материалам Форума на Исходниках.Ру. Copyright © 2002 by Sources.ru. All rights reserved. |