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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 25, средняя оценка - 4.64
Shim
 Аватар для Shim
25 / 25 / 1
Регистрация: 21.11.2009
Сообщений: 159
08.12.2009, 22:49     Реализация алгоритма сортировки для любых типов данных #1
Помогите пожалуйста переделать реализацию сортировки так, чтобы она могла работать с любыми типами данных(int, double, etc) Т.е. могла сортировать не только целые числа, но и строки, etc.. Начал делать через функцию обратного вызова и застрял..

вот header:

sort.h
typedef int (*cmp_fnx)(void*, void*)

void sort(void *v, int c, int s, cmp_fnx);
//указатель на массив, количество элементов, на размерность каждого элемента

Сам алгоритм:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
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); // Двигаем минимальное число вверх, тем самым сортируя числа
}
}
}
Нужно реализовать функцию, которую мы объявляем в хедере, и чтобы она могла работать с любыми типами данных...данных int, double, etc... т.е. была универсальной. Вот как-то так...мэйби кто нибудь подскажет ?)) Заранее спасибо.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.12.2009, 22:49     Реализация алгоритма сортировки для любых типов данных
Посмотрите здесь:

C++ Работа с табличными базами данных. Реализация функции сортировки.
Реализация алгоритма Рабина-Карпа для двух однонаправленных линейных списков C++
Засечь время сортировки разных типов данных C++
C++ Провести исследования быстродействия алгоритма сортировки для различного числа элементов в массиве
Требуется реализация простейшего алгоритма сжатия данных (кодирование повторов) C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Shim
 Аватар для Shim
25 / 25 / 1
Регистрация: 21.11.2009
Сообщений: 159
21.12.2009, 17:37  [ТС]     Реализация алгоритма сортировки для любых типов данных #21
зачем генерировать 2 массива ? мне не нужно демонстрировать как сортируются любые типы данных, эта функция должна быть в библиотеке(какбэ задание-то в этом и заключается), а так программа генерит массив, сортирует его, сравнивает время сортировки с quicksort, и выводит на экран, потом спрашивает - ввести ли отсортированный массив ? y/n - выводит/не выводит -> выход из программы, по этой претензий ко мне не было.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16825 / 5246 / 321
Регистрация: 30.03.2009
Сообщений: 14,126
Записей в блоге: 26
21.12.2009, 18:03     Реализация алгоритма сортировки для любых типов данных #22
Цитата Сообщение от Shim Посмотреть сообщение
зачем генерировать 2 массива ?
Можешь вводить массив с клавиатуры, если не впадлу. По мне проще иметь в программе несколько массивов, запустить программу и по печати сразу глазами видеть, правильно работает программа, или нет. Если тебе больше нравится каждый раз вводить массив с клавиатуры - ради бога.

Я пытаюсь тебе по шагам объяснить, как правильно написать программу (чтобы ты сам понял)
Shim
 Аватар для Shim
25 / 25 / 1
Регистрация: 21.11.2009
Сообщений: 159
21.12.2009, 21:53  [ТС]     Реализация алгоритма сортировки для любых типов данных #23
Цитата Сообщение от Evg Посмотреть сообщение
Можешь вводить массив с клавиатуры, если не впадлу. По мне проще иметь в программе несколько массивов, запустить программу и по печати сразу глазами видеть, правильно работает программа, или нет. Если тебе больше нравится каждый раз вводить массив с клавиатуры - ради бога.

Я пытаюсь тебе по шагам объяснить, как правильно написать программу (чтобы ты сам понял)
вообще-то у меня массив генерируется рандомно, например 2000 элементов, но для наглядности можно меньше сделать.
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16825 / 5246 / 321
Регистрация: 30.03.2009
Сообщений: 14,126
Записей в блоге: 26
21.12.2009, 22:48     Реализация алгоритма сортировки для любых типов данных #24
Короче. Напиши рабочий вариант программы и выложи его ЦЕЛИКОМ на форум. Чтобы я хотя бы видел, что ты там уже наваял и как двигаться дальше.
Shim
 Аватар для Shim
25 / 25 / 1
Регистрация: 21.11.2009
Сообщений: 159
22.12.2009, 19:03  [ТС]     Реализация алгоритма сортировки для любых типов данных #25
mergesort.h
C++
1
2
3
4
5
6
typedef int (*cmp_fnx)(void*, void*);
 
void mergesort(void *v, int c, int s, cmp_fnx); //указатель на массив, 
                                                              //количество элементов в массиве,
                                                              //размер каждого элемента в байтах, 
                                                             //указатель на функцию

mergesort.сpp

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
#include "mergesort.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]; // и здесь мы меняем местами два числа в буфере
*/
}
void mergesort(void *v, int c, int s, cmp_fnx cmp);
{
//вот тут планируется реализовать ф-ю для сорт. любых данных
}
main.cpp
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
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
#include <stdio.h>
#include <time.h>
#include <conio.h>
#include <math.h>
#include <stdlib.h>
#include "mergesort.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 3000
    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));
    int i;
    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 sort1 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 sort2 takes  %.0f msec.\r\n", MAX, f1);
 
    // Вы хотите просмотреть отсортированные данные?
    printf("\r\n\r\n\r\nDo you want to view the sorting result? (y/n)"); 
    short Key = 0;
 
    while (Key = _getch()) // Ожидание нажатия на кнопку
    {
        if (Key == 'n' || Key == 'N' || Key == 'N') // если нажата кнопк N или Esc, то
            return; // выход
        else if (Key == 'y' || Key == 'Y') // если y, то
            break; // то продолжаем
    }
 
    printf("\r\n\r\n\r\n");
    printf(" N.    unsorted        N.     q sort       N.    merge 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(); // Ожидание нажатия на кнопку
}
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16825 / 5246 / 321
Регистрация: 30.03.2009
Сообщений: 14,126
Записей в блоге: 26
22.12.2009, 19:31     Реализация алгоритма сортировки для любых типов данных #26
Запустил программу, она мне в ответ пишет
Sorting 3000 elements with the sort1 takes 10000 msec.
Ты можешь по этой надписи оценить правильность работы? Я - нет

Я выкинул к чёртовой матери весь твой main и написал свой. Без красоты в виде времени сортировки, случайно сгенерённых массивов, вопросов и прочего. Ты можешь проверять на своём, но я предпочитаю на своём

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
int main()
{
    const int MAX = 10;
    int a[MAX] = { 1, 7, 8, 34, 2, 5, 0, 6, 9, 3 };
    int i;
 
    Sort (a, MAX);
    for (int i = 0; i < MAX; i++)
      printf ("%d ", a[i]);
    printf ("\n");
 
    return 0;
}
Результат такой:

Код
0 1 2 3 5 6 7 8 9 34
Т.е. оно по крайне мере работает

--------------------------------------------------------

Шаг N2:
Поменяй функцию Change. Сечай ты передаёшь указатель на начало массива и индексы. Перепиши так, чтобы подавались просто указатели на два элемента массива (т.е. чтобы обмен местами работал обсьрагированно от массива и был универсальным с точностью до типа переменной)

Шаг N3:
Сравнение двух элементов вместо операции "<" или ">" делай через функцию сравнения, которую пока просто напиши рядом и пусть она принимает указатели на два int'а
Shim
 Аватар для Shim
25 / 25 / 1
Регистрация: 21.11.2009
Сообщений: 159
22.12.2009, 20:01  [ТС]     Реализация алгоритма сортировки для любых типов данных #27
Цитата Сообщение от Evg Посмотреть сообщение
Запустил программу, она мне в ответ пишет
Sorting 3000 elements with the sort1 takes 10000 msec.
Ты можешь по этой надписи оценить правильность работы? Я - нет

Я выкинул к чёртовой матери весь твой main и написал свой. Без красоты в виде времени сортировки, случайно сгенерённых массивов, вопросов и прочего. Ты можешь проверять на своём, но я предпочитаю на своём

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
int main()
{
    const int MAX = 10;
    int a[MAX] = { 1, 7, 8, 34, 2, 5, 0, 6, 9, 3 };
    int i;
 
    Sort (a, MAX);
    for (int i = 0; i < MAX; i++)
      printf ("%d ", a[i]);
    printf ("\n");
 
    return 0;
}
Результат такой:

Код
0 1 2 3 5 6 7 8 9 34
Т.е. оно по крайне мере работает

--------------------------------------------------------

Шаг N2:
Поменяй функцию Change. Сечай ты передаёшь указатель на начало массива и индексы. Перепиши так, чтобы подавались просто указатели на два элемента массива (т.е. чтобы обмен местами работал обсьрагированно от массива и был универсальным с точностью до типа переменной)

Шаг N3:
Сравнение двух элементов вместо операции "<" или ">" делай через функцию сравнения, которую пока просто напиши рядом и пусть она принимает указатели на два int'а
выкинь mergesort.сpp нафиг, он недоделан, поэтому такую ерунду выдает. Твой код у меня тож ошибку выдает - Ошибка error C3861: Sort: идентификатор не найден
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16825 / 5246 / 321
Регистрация: 30.03.2009
Сообщений: 14,126
Записей в блоге: 26
22.12.2009, 20:08     Реализация алгоритма сортировки для любых типов данных #28
> выкинь mergesort.сpp нафиг, он недоделан, поэтому такую ерунду выдает.

main у тебя в файле main.cpp. И как связано "выкинь mergesort" с тем, что я писал выше - непонятно. Какие ты мне дал исходники, те я и компилял
Shim
 Аватар для Shim
25 / 25 / 1
Регистрация: 21.11.2009
Сообщений: 159
22.12.2009, 20:12  [ТС]     Реализация алгоритма сортировки для любых типов данных #29
Цитата Сообщение от Evg Посмотреть сообщение
> выкинь mergesort.сpp нафиг, он недоделан, поэтому такую ерунду выдает.

main у тебя в файле main.cpp. И как связано "выкинь mergesort" с тем, что я писал выше - непонятно. Какие ты мне дал исходники, те я и компилял
в MS Visual Studio C++ компилил ?
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16825 / 5246 / 321
Регистрация: 30.03.2009
Сообщений: 14,126
Записей в блоге: 26
22.12.2009, 21:56     Реализация алгоритма сортировки для любых типов данных #30
Компилил gcc'ями, правда не пойму, какая от этого разница?
Shim
 Аватар для Shim
25 / 25 / 1
Регистрация: 21.11.2009
Сообщений: 159
22.12.2009, 22:03  [ТС]     Реализация алгоритма сортировки для любых типов данных #31
Цитата Сообщение от Evg Посмотреть сообщение
Компилил gcc'ями, правда не пойму, какая от этого разница?
я не знаю, ибо не разбираюсь особенно, попробуй только main скомпилить, у меня он чётко работает))
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16825 / 5246 / 321
Регистрация: 30.03.2009
Сообщений: 14,126
Записей в блоге: 26
22.12.2009, 22:18     Реализация алгоритма сортировки для любых типов данных #32
Я и не говорю, что твой main не работает. Твой main печатает только то, что я уже написал выше. По этой печати невозможно понять, работает оно или нет. В моём варианте main'а стоит конкретная печать конкретного массива и я, глядя глазами на массив, забитый в процедуре main и глядя на печать, которая рожается в процессе работы программы, вижу, что программа работает правильно хотя бы для такого массива. Это подаёт надежду на то, что программа будет работать правильно для любого массива (собственно, поэтому я и предложил написать несколько массивов)

Теперь выполни шаги 2 и 3 из поста #26. Таки образом постепенно мы доберёмся до того, что тебе нужно. Для начала для простоты работай только с одним файлом (main.cpp), как сделаешь нужные исправления - выложи их на форум, будем двигаться дальше
Shim
 Аватар для Shim
25 / 25 / 1
Регистрация: 21.11.2009
Сообщений: 159
22.12.2009, 22:37  [ТС]     Реализация алгоритма сортировки для любых типов данных #33
Цитата Сообщение от Evg Посмотреть сообщение
Теперь выполни шаги 2 и 3 из поста #26. Таки образом постепенно мы доберёмся до того, что тебе нужно. Для начала для простоты работай только с одним файлом (main.cpp), как сделаешь нужные исправления - выложи их на форум, будем двигаться дальше
мне очень стыдно, но я не знаю как сделать(( мэйби по шагам объяснишь, и я понемногу буду учиться, мне сдавать в конце недели, теперь жалею что не собрался и не сел делать раньше...
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16825 / 5246 / 321
Регистрация: 30.03.2009
Сообщений: 14,126
Записей в блоге: 26
22.12.2009, 23:44     Реализация алгоритма сортировки для любых типов данных #34
Цитата Сообщение от Shim Посмотреть сообщение
мне очень стыдно, но я не знаю как сделать(( мэйби по шагам объяснишь, и я понемногу буду учиться, мне сдавать в конце недели, теперь жалею что не собрался и не сел делать раньше...
Писать готовый вариант вроде бы порешили, что не стОит. Читать лекции по Си мне как-то не хочется. Я для того и просил тебя выложить текст программы, чтобы по шагам её приводить в нужный вид. Что должны делать следующие два шага, я написал. Либо изучай книгу по Си, либо придётся давать готовое решение
Shim
 Аватар для Shim
25 / 25 / 1
Регистрация: 21.11.2009
Сообщений: 159
23.12.2009, 08:06  [ТС]     Реализация алгоритма сортировки для любых типов данных #35
Цитата Сообщение от Evg Посмотреть сообщение
Писать готовый вариант вроде бы порешили, что не стОит. Читать лекции по Си мне как-то не хочется. Я для того и просил тебя выложить текст программы, чтобы по шагам её приводить в нужный вид. Что должны делать следующие два шага, я написал. Либо изучай книгу по Си, либо придётся давать готовое решение
может попробовать, а ? вкратце следующие 2 шага объяснить, попробую понять, а то изучать книгу как-то поздновато что ли...
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16825 / 5246 / 321
Регистрация: 30.03.2009
Сообщений: 14,126
Записей в блоге: 26
23.12.2009, 14:47     Реализация алгоритма сортировки для любых типов данных #36
> вкратце следующие 2 шага объяснить

Я и так уже написал яснее некуда. Читать лекции по Си я точно не буду
Shim
 Аватар для Shim
25 / 25 / 1
Регистрация: 21.11.2009
Сообщений: 159
23.12.2009, 15:46  [ТС]     Реализация алгоритма сортировки для любых типов данных #37
Цитата Сообщение от Evg Посмотреть сообщение
> вкратце следующие 2 шага объяснить

Я и так уже написал яснее некуда. Читать лекции по Си я точно не буду
чорт...разбираться времени уже нету; тогда надежда только на готовое решение, буду очень благодарен.
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16825 / 5246 / 321
Регистрация: 30.03.2009
Сообщений: 14,126
Записей в блоге: 26
23.12.2009, 17:43     Реализация алгоритма сортировки для любых типов данных #38
Надо завязывать с добрыми делами

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
#include <stdio.h>
 
/* --------- Это библиотека ---------- */
 
void
swap_mem (void *p1, void *p2, int elem_size)
{
  char *pp1 = (char*) p1;
  char *pp2 = (char*) p2;
  char tmp;
  int i;
 
  for (i = 0; i < elem_size; i++)
    {
      tmp = pp1[i];
      pp1[i] = pp2[i];
      pp2[i] = tmp;
    }
}
 
void
sort (void *arr, int num_elems, int elem_size, int (*cmp_func) (void*, void*))
{
  int i, j;
  void *pi, *pj;
 
  for (i = 0; i < (num_elems - 1); i++)
    for (j = i + 1; j < num_elems; j++)
      {
        /* Указатели на элементы массива arr[i] и arr[j] */
        pi = (char*)arr + i * elem_size;
        pj = (char*)arr + j * elem_size;
 
        /* Если элемент arr[i] > arr[j], то меняем их местами */
        if (cmp_func (pi, pj) > 0)
          swap_mem (pi, pj, elem_size);
      }
}
 
/* --------- Это пользовательские коды ---------- */
 
int
cmp_int (void *p1, void *p2)
{
  int *pp1 = (int*) p1;
  int *pp2 = (int*) p2;
 
  if (*pp1 < *pp2)
    return -1;
  else if (*pp1 == *pp2)
    return 0;
  else
    return 1;
}
 
int
cmp_double (void *p1, void *p2)
{
  double *pp1 = (double*) p1;
  double *pp2 = (double*) p2;
 
  if (*pp1 < *pp2)
    return -1;
  else if (*pp1 == *pp2)
    return 0;
  else
    return 1;
}
 
int
main (void)
{
#define MAX_a 10
  int a[MAX_a] = { 1, 7, 8, 34, 2, 5, 0, 6, 9, 3 };
#define MAX_b 12
  double b[MAX_b] = { 1.0, 7.0, 8.0, 34.0, 2.0, 5.0, 0.0, 6.0, 9.0, 3.0, 12.0, 17.0 };
  int i;
 
  sort (a, MAX_a, sizeof (a[0]), cmp_int);
  for (i = 0; i < MAX_a; i++)
    printf ("%d ", a[i]);
  printf ("\n");
 
  sort (b, MAX_b, sizeof (b[0]), cmp_double);
  for (i = 0; i < MAX_b; i++)
    printf ("%f ", b[i]);
  printf ("\n");
 
  return 0;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.12.2009, 19:28     Реализация алгоритма сортировки для любых типов данных
Еще ссылки по теме:

Написать программу для реализации алгоритма сортировки методом пирамиды C++
C++ Реализация алгоритма быстрой сортировки quickSort
C++ Реализация алгоритма пузырьковой сортировки

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

Или воспользуйтесь поиском по форуму:
Shim
 Аватар для Shim
25 / 25 / 1
Регистрация: 21.11.2009
Сообщений: 159
23.12.2009, 19:28  [ТС]     Реализация алгоритма сортировки для любых типов данных #39
Цитата Сообщение от Evg Посмотреть сообщение
Надо завязывать с добрыми делами

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
#include <stdio.h>
 
/* --------- Это библиотека ---------- */
 
void
swap_mem (void *p1, void *p2, int elem_size)
{
  char *pp1 = (char*) p1;
  char *pp2 = (char*) p2;
  char tmp;
  int i;
 
  for (i = 0; i < elem_size; i++)
    {
      tmp = pp1[i];
      pp1[i] = pp2[i];
      pp2[i] = tmp;
    }
}
 
void
sort (void *arr, int num_elems, int elem_size, int (*cmp_func) (void*, void*))
{
  int i, j;
  void *pi, *pj;
 
  for (i = 0; i < (num_elems - 1); i++)
    for (j = i + 1; j < num_elems; j++)
      {
        /* Указатели на элементы массива arr[i] и arr[j] */
        pi = (char*)arr + i * elem_size;
        pj = (char*)arr + j * elem_size;
 
        /* Если элемент arr[i] > arr[j], то меняем их местами */
        if (cmp_func (pi, pj) > 0)
          swap_mem (pi, pj, elem_size);
      }
}
 
/* --------- Это пользовательские коды ---------- */
 
int
cmp_int (void *p1, void *p2)
{
  int *pp1 = (int*) p1;
  int *pp2 = (int*) p2;
 
  if (*pp1 < *pp2)
    return -1;
  else if (*pp1 == *pp2)
    return 0;
  else
    return 1;
}
 
int
cmp_double (void *p1, void *p2)
{
  double *pp1 = (double*) p1;
  double *pp2 = (double*) p2;
 
  if (*pp1 < *pp2)
    return -1;
  else if (*pp1 == *pp2)
    return 0;
  else
    return 1;
}
 
int
main (void)
{
#define MAX_a 10
  int a[MAX_a] = { 1, 7, 8, 34, 2, 5, 0, 6, 9, 3 };
#define MAX_b 12
  double b[MAX_b] = { 1.0, 7.0, 8.0, 34.0, 2.0, 5.0, 0.0, 6.0, 9.0, 3.0, 12.0, 17.0 };
  int i;
 
  sort (a, MAX_a, sizeof (a[0]), cmp_int);
  for (i = 0; i < MAX_a; i++)
    printf ("%d ", a[i]);
  printf ("\n");
 
  sort (b, MAX_b, sizeof (b[0]), cmp_double);
  for (i = 0; i < MAX_b; i++)
    printf ("%f ", b[i]);
  printf ("\n");
 
  return 0;
}
большое спасибо

p.s.: если у меня появится желание учиться программированию (ааа, сейчас, размечтался ) то на каких примерах/заданиях лучше начать тренироваться ?
Yandex
Объявления
23.12.2009, 19:28     Реализация алгоритма сортировки для любых типов данных
Ответ Создать тему
Опции темы

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