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

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

Восстановить пароль Регистрация
 
_д_м_и_т_р_и_й_
 Аватар для _д_м_и_т_р_и_й_
0 / 0 / 0
Регистрация: 11.02.2011
Сообщений: 35
22.08.2011, 22:08     подпрограмма для универсальной сортировки #1
извините за то, что опять прошу помощи.
нужно разработать алгоритм и описать подпрограмму для универсальной сортировки произвольного массива с произвольным базовым типом. Подпрограмме передается массив как нетипизованный параметр, его длина, размер элемента и логическая функция сравнения двух элементов массива.

Я был бы очень признателен, если бы эта программа была написана на Си, потому что в С++ я ничего не смыслю. Заранее, всем откликнувшимся огромное спасибо.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.08.2011, 22:08     подпрограмма для универсальной сортировки
Посмотрите здесь:

C++ Подпрограмма для нахождения максимального элемента массива
C++ Подпрограмма для обнаружения корней квадратного тричлена
C++ Составить блок – схемы для шейкер- сортировки и сортировки Шелла
C++ Составить программы для пузырьковой сортировки и сортировки посредством выбора с применением оператора while
C++ Программа для сортировки
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
nameless
Эксперт C++
 Аватар для nameless
289 / 288 / 14
Регистрация: 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;
}
Пирамидальная сортировочка.. Удачи
rangerx
1908 / 1517 / 139
Регистрация: 31.05.2009
Сообщений: 2,876
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;
}
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
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;
}
Yandex
Объявления
23.08.2011, 03:21     подпрограмма для универсальной сортировки
Ответ Создать тему
Опции темы

Текущее время: 08:28. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru