Консультация № 178154
01.05.2010, 14:16
0.00 руб.
0 2 1
Доброго времени суток дорогие эксперты:
Требуется решить задачу на Turbo C или на Code block

Написать подпрограмму для универсальной сортировки произвольного массива с произвольным базовым типом. Подпрограмме передается массив как нетипизованный параметр, его длина, размер элемента и логическая функция сравнения двух элементов массива.

Обсуждение

Неизвестный
03.05.2010, 16:38
общий
это ответ
Здравствуйте, Юдин Евгений Сергеевич.

Текст программы (требуемая функция и тестовый пример) приведен в приложении. В программе реализован один из простейших алгоритмов сортировки — сортировка выбором. В исходниках библиотеки (поставляется в комплекте с компилятором, например, Borland C++ 3.1) можно посмотреть реализацию быстрой сортировки (функция qsort).

Программа компилировалась и проверялась в режиме "чистого Си" в Borland C++ 3.1 и MSVC++ 6.0 (сохраните в файле с расширением .c). Если Ваш компилятор не понимает комментарии, начинающиеся с '//', то замените их на /* */; если не понимает квалификатор const, то просто уберите его.

Успехов!

Приложение:
/*
Вопрос № 178154
Написать подпрограмму для универсальной сортировки произвольного массива
с произвольным базовым типом. Подпрограмме передается массив как
нетипизованный параметр, его длина, размер элемента и логическая функция
сравнения двух элементов массива.
*/
#include <stddef.h>
#include <stdio.h>

#ifndef _countof
#define _countof(array) (sizeof(array)/sizeof(array[0]))
#endif

typedef int (__cdecl *compare_func )( const void *elem1, const void *elem2 );

/*
функция сортировки выбором

Сортировка выбором — алгоритм сортировки, относящийся к неустойчивым
алгоритмам сортировки. На массиве из n элементов имеет время
выполнения в худшем, среднем и лучшем случае O(n^2), предполагая что
сравнения делаются за постоянное время.

Шаги алгоритма:
1. находим минимальное значение в текущем списке
2. производим обмен этого значения со значением на первой неотсортированной позиции
3. теперь сортируем хвост списка, исключив из рассмотрения уже отсортированные элементы

Параметры:
base - указатель на сортируемый массив;
n - число элементов в массиве
width - размер ("ширина") одного элемента в байтах
compare - указатель на функцию сравнения
*/
void sort( void* base, size_t n, size_t width, compare_func compare )
{
size_t i, j, iMin;
// внутри используем тип char*, поскольку sizeof(char)==1
char *pMin, *pi, *pj, tmp;
pi = (char*)base;
for( i = 0; i < n-1; ++i, pi += width ) {
pMin = pi;
iMin = i;
// находим минимальное значение в конце массива
for( pj = pi+width, j = i+1; j < n; ++j, pj += width ) {
if( compare( pj, pMin ) < 0 ) {
pMin = pj;
iMin = j;
}
}
// производим обмен минимального значения со значением на первой неотсортированной позиции
if( iMin != i ) {
for( j = 0; j < width; ++j ) { // побайтовая перестановка элементов массива
tmp = pi[j];
pi[j] = pMin[j];
pMin[j] = tmp;
}
}
}
}

/*
Функция сравнения. Она должна возвращать:
- отрицательное значение, если первый элемент меньше второго;
- положительное - если первый больше второго;
- 0, если элементы равны.
*/
int __cdecl icomp( const void* p1, const void* p2 )
{
return *(int*)p1 - *(int*)p2;
}

/* Вывод массива на экран */
void print_arr( int* p, int n )
{
int i;
for( i = 0; i < n; ++i )
printf( "%d, ", p[i] );
printf( "\n" );
}

// проверим функцию сортировки на массиве целых чисел
static int test[] = { 1, 10, 4, 6, 3, 5, -4, 0, 17, 25, 20, 8, 14 } ;

int main()
{
printf( "Исходный массив:\n" );
print_arr( test, _countof(test) );
sort( (void*)test, _countof(test), sizeof(int), icomp );
printf( "Отсортированный массив:\n" );
print_arr( test, _countof(test) );
return 0;
}
Неизвестный
12.05.2010, 16:05
общий
Ответ радует глаз. Большое спасибо Amnick
Форма ответа