Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
0 / 0 / 0
Регистрация: 11.02.2011
Сообщений: 38
1

подпрограмма для универсальной сортировки

22.08.2011, 22:08. Просмотров 1233. Ответов 3
Метки нет (Все метки)

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

Я был бы очень признателен, если бы эта программа была написана на Си, потому что в С++ я ничего не смыслю. Заранее, всем откликнувшимся огромное спасибо.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.08.2011, 22:08
Ответы с готовыми решениями:

Использование универсальной инициализации для объектов своего класса
Здравствуйте! Все мы знаем, что поля структуры мы можем красиво инициализировать через {...}. Тогда...

Написать шаблонную функцию для универсальной отрисовки данных, содержащихся в объектах, засунутых в вектор
Существует базовый класс и два класса наследника от него. Хочу сделать функцию для универсальной...

Подпрограмма сортировки массива из записей вставками
Разработать программу с подпрограммой сортировки вставками массива из записей. Заранее спасибо.

Подпрограмма общего вида сортировки элементов
составить подпрограмму сортировки элементов по убыванию одномерного вещественного массива. С...

3
Эксперт С++
340 / 304 / 36
Регистрация: 16.06.2009
Сообщений: 486
22.08.2011, 23:39 2
_д_м_и_т_р_и_й_,

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
#include <iostream>
#include <iterator>
#include <vector>
#include <algorithm>
#include <functional>
 
template <class Iterator>
void DownHeap(Iterator first, int current, int size) {
   std::size_t index_child;
   auto element = *(first + current);
 
   while(current <= size / 2) {
      index_child = 2 * current;
 
      if ((index_child < size) && (*(first + index_child) < *(first + index_child + 1))) {
         index_child++;
      }
      
      if (element >= *(first + index_child)) { 
         break;
      }
 
      *(first + current) = *(first + index_child);
      current = index_child;
   }
   *(first + current) =  element;
}
 
template <class Iterator>
void SortByHeap(Iterator first, Iterator last) {
   std::size_t size = last - first;
 
   for (int i = size / 2 - 1; i >= 0; --i) {
      DownHeap(first, i, size - 1);
   }
 
   for (int i = size - 1; i > 0; --i) {
      std::swap(*(first + i), *first);
      DownHeap(first, 0, i - 1);
   }
}
 
int main() {
   std::vector <int> v_nums = { 2, 0, -4, 7, -5, 8, 10, 15, -6 };
 
   SortByHeap(v_nums.begin(), v_nums.end());
   
   std::for_each(v_nums.begin(), v_nums.end(), [](int number) {
      std::cout << number << std::endl;
   } );
 
   return 0;
}
Пирамидальная сортировочка.. Удачи
1
1992 / 1592 / 488
Регистрация: 31.05.2009
Сообщений: 2,980
23.08.2011, 03:21 3
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
61
62
63
64
65
66
67
68
69
70
71
72
#include <stdio.h>
#include <stddef.h>
#include <string.h>
 
//----------------
 
int cmp_int(const void* a, const void* b)
{
    return *(int*)a - *(int*)b;
}
 
//----------------
 
int cmp_str(const void* a, const void* b)
{
    return strcmp(*(char**)a, *(char**)b);
}
 
//----------------
void swap(void* first, void* second, size_t size)
{
    char t;
    char* a = (char*)first;
    char* b = (char*)second;
 
    do
    {
        t = *a;
        *a++ = *b;
        *b++ = t;
    } while(--size);
}
 
//----------------
void bubble_sort(void* arr, size_t n, size_t size, int (*cmp)(const void* a, const void* b))
{
    size_t i, j;
    char* p;
 
    for(i = 0; i < n; ++i)
    {
        for(j = n-1; j > i; --j)
        {
            p = (char*)arr + j * size;
            if(cmp(p, p - size) < 0)
                swap(p, p - size, size);
        }
    }
}
 
//----------------
 
#define N 5
 
int main()
{
    int i;
    int d[N] = {3,2,5,4,1};
    char* s[N] = {"adf", "dpkjw", "blkjd", "cvklj", "ecjq"};
 
    bubble_sort(d, N, sizeof(int), cmp_int);
    for(i = 0; i < N; ++i)
        printf("%d ", d[i]);
    putchar('\n');
 
    bubble_sort(s, N, sizeof(char*), cmp_str);
    for(i = 0; i < N; ++i)
        printf("%s ", s[i]);
    putchar('\n');
 
    return 0;
}
1
Модератор
Эксперт JavaЭксперт CЭксперт С++
10812 / 6596 / 1612
Регистрация: 25.07.2009
Сообщений: 12,359
23.08.2011, 03:21 4
Быструю сортировку лениво делать - много букв
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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
// ANSI C 99
 
#include <stdio.h>
#include <string.h>
 
#define swap(a, b, size) ({ unsigned char tmp[(size)]; memcpy(tmp, (a), (size)); memcpy((a), (b), (size)); memcpy((b), tmp, (size)); })
 
void mysort(void * arr, size_t count, size_t size, int (*func)(const void *, const void *)){
    void * pArr, * pCurrent, * pFirst;
    
    for ( pArr = arr; pArr < ( arr + (count - 1) * size ); pArr += size ){
        pFirst = pArr;
        for ( pCurrent = pArr + size; pCurrent < ( arr + count * size ); pCurrent += size )
            if ( func(pFirst, pCurrent) > 0 )
                pFirst = pCurrent;
        if ( pFirst != pArr )
            swap(pArr, pFirst, size);
    }
}
 
int cmp_char_ascendant(const void * a, const void * b){
    return *(char*)a - *(char*)b;
}
 
int cmp_char_descendant(const void * a, const void * b){
    return cmp_char_ascendant(b, a);
}
 
int cmp_int_ascendant(const void * a, const void * b){
    return *(int*)a - *(int*)b;
}
 
int cmp_int_descendant(const void * a, const void * b){
    return cmp_int_ascendant(b, a);
}
 
int cmp_double_ascendant(const void * a, const void * b){
    double diff = *(double*)a - *(double*)b;
    return ( diff < 0.0 ) ? -1 : ( diff > 0.0 ) ? 1 : 0;
}
 
int cmp_double_descendant(const void * a, const void * b){
    return cmp_double_ascendant(b, a);
}
 
#define SIZE 5
 
int main(void){
    char cArr[SIZE] = { 'b', 'd', 'a', 'c', 'e' };
    int iArr[SIZE] = { 3, 1, 2, 5, 4 };
    double dArr[SIZE] = { 2.0, 3.1, 4.4, 1.8, 5.4 };
    
    int i;
    
    printf("Char unsorted:\n");
    for ( i = 0; i < SIZE; ++i )
        printf("%c ", cArr[i]);
    printf("\n");
    
    mysort(cArr, SIZE, sizeof(char), cmp_char_ascendant);
    printf("Char sorted ascendant:\n");
    for ( i = 0; i < SIZE; ++i )
        printf("%c ", cArr[i]);
    printf("\n");
    
    mysort(cArr, SIZE, sizeof(char), cmp_char_descendant);
    printf("Char sorted descendant:\n");
    for ( i = 0; i < SIZE; ++i )
        printf("%c ", cArr[i]);
    printf("\n");
    
    printf("Int unsorted:\n");
    for ( i = 0; i < SIZE; ++i )
        printf("%d ", iArr[i]);
    printf("\n");
    
    mysort(iArr, SIZE, sizeof(int), cmp_int_ascendant);
    printf("Int sorted ascendant:\n");
    for ( i = 0; i < SIZE; ++i )
        printf("%d ", iArr[i]);
    printf("\n");
    
    mysort(iArr, SIZE, sizeof(int), cmp_int_descendant);
    printf("Int sorted descendant:\n");
    for ( i = 0; i < SIZE; ++i )
        printf("%d ", iArr[i]);
    printf("\n");
    
    printf("Double unsorted:\n");
    for ( i = 0; i < SIZE; ++i )
        printf("%.1f ", dArr[i]);
    printf("\n");
    
    mysort(dArr, SIZE, sizeof(double), cmp_double_ascendant);
    printf("Double sorted ascendant:\n");
    for ( i = 0; i < SIZE; ++i )
        printf("%.1f ", dArr[i]);
    printf("\n");
    
    mysort(dArr, SIZE, sizeof(double), cmp_double_descendant);
    printf("Double sorted descendant:\n");
    for ( i = 0; i < SIZE; ++i )
        printf("%.1f ", dArr[i]);
    printf("\n");
    
    return 0;
}
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.08.2011, 03:21

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Подпрограмма сортировки элементов одномерного вещественного массива по убыванию
Составить подпрограмму сортировки элементов по убыванию одномерного вещественного массива. С...

Подпрограмма сортировки массива по возрастанию среднего арифметического всех цифр в числе
Дан массив, заполненный случайными целыми числами в диапазоне от -30000 до 30000. Напишите...

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

Создание универсальной библиотеки для включаемых файлов.
Включаю несколько файлов один в другой: &lt;!-- #INCLUDE File='svdbfunc.asp' --&gt; Получаются взаимные...

Библиотека / класс для универсальной работы с DataGridView
Добрый вечер! Подскажите пожалуйста, существуют ли универсальные решения (библиотеки) для...

Организация алгоритма для универсальной программы под микроконтроллер
Здравствуйте уважаемые программисты интересует следующий алгоритм для следующей задачи: задача:...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.