Форум программистов, компьютерный форум CyberForum.ru

Реализация алгоритма сортировки для любых типов данных - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ строки:ПЕРЕВОД ИЗ ОДНОЙ C/ С В ДР http://www.cyberforum.ru/cpp-beginners/thread72072.html
Вывести все числа не превышающие данное N, которые в 2-ной системе счислания имеют симметричную запись ( начинается с 1!). Помогите юному гению в юбке сдать задачу на зачет! Пасибки за понимание
C++ Сортировка пузырьком... Доброе утро/день/вечер!=) У меня есть пару вопросов, на которые я никак не могу найти ответов... Есть программа, в которй проставляется оценка каждого студента за определённый предмет, всё ничего кроме одного, не работает сортировка(по студентам и оценкам) пузырьком... Никаких изменений эта сортировка не принесла...Почитал ваш форум, и натыкался впринцепе на тоже самое, что я в своём коде... http://www.cyberforum.ru/cpp-beginners/thread72069.html
C++ Замена в одномерном массиве, работа со строками из нулей и единиц
HELP!!!я ноль в с++ не могу сделать данные задачи: "Даны одномерные массивы чисел Х,размерностью n и Y,размерностью m. необходимо написать программу с использованием функций в которой будут заменятся нулями все положительные элементы в массивах." "дана строка состоящая из групп нулей и едениц. каждая группа отделяется друг от друга одним или несколькими пробелами. нужно создать программу...
C++ Структуру
Помогите решить задачи...пробовал ничего не смог понять. 1) Определить структуры, описывающие шар и точку в трёхмерном пространстве. Составить и протестировать функцию, которая проверяет, находится ли точка внутри заданного шара. и вторая, уже была но я не смог понять, объяснить 2) Описать процедуру IncTime(H, M, S, T), которая увеличивает на Т секунд время, заданное в часах Н, минутах М...
C++ Алгоритм бинарных вставок http://www.cyberforum.ru/cpp-beginners/thread72058.html
подскажите пожалуйста как изменить алгоритм простых вставок.чтобы преобразовать его в алгоритм бинарных вставок..
C++ Вычислить произведение элементов массива S, значение которых не больше заданного негативного числа Здесь задали на Борланде С++ ну просто нечто (я нуб в этом деле) 1.Вычислить произведение элементов массива S ,значение которых не больше заданного негативного числа A, а индексы нечетные(Кол.элементов:N=16;Элементы:от -9 до 4;A=-4;) 2.Найти количество одинаковых элементов которые находятся в массиве A(N). ( Кол.элементов:N=21;Элементы:от -4 до 4;) 3.Найти и напечатать, сколько не... подробнее

Показать сообщение отдельно
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16821 / 5242 / 318
Регистрация: 30.03.2009
Сообщений: 14,118
Записей в блоге: 26
10.12.2009, 23:21     Реализация алгоритма сортировки для любых типов данных
Сделаем обобщённую функцию, которая в массиве произвольного типа переставляет местами два элемента. Для сортировки нужна будет аналогичная функция, которая сравнивает два элемента. Программу не запускал и не проверял - чисто чтобы объяснить, по какому принципу

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
/* data - указатель на массив
 * elem_size - размер елемента массива
 * i1, i2 - индексы элементов, которые надо поменять местами
 * swap_func - указатель на функцию для конкретного типа, которая будет переставлять
 * местами элементы */
void
swap (void *data, int elem_size, int i1, int i2, void (*swap_func)(void*, void*))
{
  void *p1, *p2;
 
  /* Вычисляем адреса элементов массива */
  p1 = (char*)data + i1*elem_size;
  p2 = (char*)data + i2*elem_size;
 
  /* Меняем местами элементы */
  swap_func (p1, p2);
}
 
/* Функция, для обмена местами двух int'ов */
void
swap_int (void *p1, void *p2)
{
  int *pp1, *pp2, tmp;
 
  pp1 = (int*) p1;
  pp2 = (int*) p2;
 
  tmp = *pp1;
  *pp1 = *pp2;
  *pp2 = tmp;
}
 
/* Функция, для обмена местами двух double'ов */
void
swap_double (void *p1, void *p2)
{
  double *pp1, *pp2, tmp;
 
  pp1 = (int*) p1;
  pp2 = (int*) p2;
 
  tmp = *pp1;
  *pp1 = *pp2;
  *pp2 = tmp;
}
 
int
main (void)
{
  int ar1[5] = { 11, 22, 33, 44, 55 };
  double ar2[5] = { 11.11, 22.22, 33.33, 44.44, 55.55 };
 
  /* Меняем местами ar1[2] и ar1[3] */
  swap (ar1, sizeof (ar1[0]), 2, 3, swap_int);
 
  /* Меняем местами ar2[3] и ar2[4] */
  swap (ar2, sizeof (ar2[0]), 3, 4, swap_double);
 
  return 0;
}
Добавлено через 2 минуты
В случае сортировки у тебя должен быть указатель на функцию, которая делает сравнение элементов и возвращает -1, 0 или 1 в зависимости от результата (меньше, равно, больше). Чтобы поменятть местами два элемента, такой мазохизм, как я привёл, не нужен. Можно просто в массиве побайтово поменять два куска от указателей на элементы. Куски размером elem_size байт
 
Текущее время: 23:44. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru