Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.76/74: Рейтинг темы: голосов - 74, средняя оценка - 4.76
 Аватар для Shim
25 / 25 / 0
Регистрация: 21.11.2009
Сообщений: 159

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

08.12.2009, 22:49. Показов 14448. Ответов 38
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Помогите пожалуйста переделать реализацию сортировки так, чтобы она могла работать с любыми типами данных(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... т.е. была универсальной. Вот как-то так...мэйби кто нибудь подскажет ?)) Заранее спасибо.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
08.12.2009, 22:49
Ответы с готовыми решениями:

Реализовать три любых алгоритма сортировки матрицы на выбор
Всем привет форумчане, сижу и ломаю голову над заданной задачей. А точнее как ее реализовать т.к в C++ не шарю. Помогит дельным советом...

Реализация алгоритма сортировки Шелла
Здравствуйте! Помогите пожалуйста с реализацией алгоритма сортировки Шелла. Вот дан простой массив: static void Main(string args) ...

Реализация алгоритма сортировки массива
Добрый день !!! Помогите пожалуйста с реализацией алгоритма сортировки массива. Нашел код, но не могу его откорректировать до рабочего...

38
 Аватар для Shim
25 / 25 / 0
Регистрация: 21.11.2009
Сообщений: 159
21.12.2009, 17:37  [ТС]
Студворк — интернет-сервис помощи студентам
зачем генерировать 2 массива ? мне не нужно демонстрировать как сортируются любые типы данных, эта функция должна быть в библиотеке(какбэ задание-то в этом и заключается), а так программа генерит массив, сортирует его, сравнивает время сортировки с quicksort, и выводит на экран, потом спрашивает - ввести ли отсортированный массив ? y/n - выводит/не выводит -> выход из программы, по этой претензий ко мне не было.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
21.12.2009, 18:03
Цитата Сообщение от Shim Посмотреть сообщение
зачем генерировать 2 массива ?
Можешь вводить массив с клавиатуры, если не впадлу. По мне проще иметь в программе несколько массивов, запустить программу и по печати сразу глазами видеть, правильно работает программа, или нет. Если тебе больше нравится каждый раз вводить массив с клавиатуры - ради бога.

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

Я пытаюсь тебе по шагам объяснить, как правильно написать программу (чтобы ты сам понял)
вообще-то у меня массив генерируется рандомно, например 2000 элементов, но для наглядности можно меньше сделать.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
21.12.2009, 22:48
Короче. Напиши рабочий вариант программы и выложи его ЦЕЛИКОМ на форум. Чтобы я хотя бы видел, что ты там уже наваял и как двигаться дальше.
0
 Аватар для Shim
25 / 25 / 0
Регистрация: 21.11.2009
Сообщений: 159
22.12.2009, 19:03  [ТС]
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(); // Ожидание нажатия на кнопку
}
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
22.12.2009, 19:31
Запустил программу, она мне в ответ пишет
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;
}
Результат такой:

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

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

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

Шаг N3:
Сравнение двух элементов вместо операции "<" или ">" делай через функцию сравнения, которую пока просто напиши рядом и пусть она принимает указатели на два int'а
0
 Аватар для Shim
25 / 25 / 0
Регистрация: 21.11.2009
Сообщений: 159
22.12.2009, 20:01  [ТС]
Цитата Сообщение от 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;
}
Результат такой:

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

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

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

Шаг N3:
Сравнение двух элементов вместо операции "<" или ">" делай через функцию сравнения, которую пока просто напиши рядом и пусть она принимает указатели на два int'а
выкинь mergesort.сpp нафиг, он недоделан, поэтому такую ерунду выдает. Твой код у меня тож ошибку выдает - Ошибка error C3861: Sort: идентификатор не найден
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
22.12.2009, 20:08
> выкинь mergesort.сpp нафиг, он недоделан, поэтому такую ерунду выдает.

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

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

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

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

Я и так уже написал яснее некуда. Читать лекции по Си я точно не буду
чорт...разбираться времени уже нету; тогда надежда только на готовое решение, буду очень благодарен.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
23.12.2009, 17:43
Надо завязывать с добрыми делами

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;
}
1
 Аватар для Shim
25 / 25 / 0
Регистрация: 21.11.2009
Сообщений: 159
23.12.2009, 19:28  [ТС]
Цитата Сообщение от 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.: если у меня появится желание учиться программированию (ааа, сейчас, размечтался ) то на каких примерах/заданиях лучше начать тренироваться ?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
23.12.2009, 19:28

Реализация алгоритма сортировки слиянием
Имеется массив строк вида char lent где каждая строка уже отсортирована по возрастанию. Нужно реализовать слияние. Просмотрел в...

Реализация алгоритма сортировки пирамидой
Все привет! Нужна помощь в реализации алгоритма пирамидальной сортировки используя ДВУСВЯЗНУЮ ОЧЕРЕДЬ (дэк) . Реализации деки на...

Реализация алгоритма сортировки слиянием
помогите, пожалуйста, с реализацией алгоритма сортировки слиянием на VBA.

Реализация алгоритма сортировки вставками
Мне нужно сделать лабу тема вверху... перед этим прочитал тему https://www.cyberforum.ru/cpp-beginners/thread27084.html все равно не...

Реализация алгоритма пузырьковой сортировки
Задача на массивы, где нужно банки переливать (ну, у меня она с этим ассоциируется). Раньше решал где-то, но уже не помню где.


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

Или воспользуйтесь поиском по форуму:
39
Ответ Создать тему
Новые блоги и статьи
После бана на Пикабу не работает авторизация аккаунта с Яндекса.
Hrethgir 09.07.2026
В частности https:/ / auto. ru/ logbook/ zapret-na-vozhdenie-posle-65-let_1cf28789-07b4-4c75-a2f7-4cd4edf9deeb тут хотел оставить комментарий такой Зрите в корень - монополизация на разработку программ. . .
GitDOS: Когда я решил скрестить MS-DOS, GitHub и Claude
MaGz GoLd 08.07.2026
Привет, Киберфорум! Хочу поделиться своим проектом, который, надеюсь, вас заинтересует. GitDOS — это веб-приложение, которое позволяет запускать DOS в браузере с тремя крутыми фичами: диски живут в. . .
Учебный мини "цифровой двойник" = (Сервер = Java + Flask_питон )+(3D = Гугловскаая 4T nvideo + google colab) +( WMS = Odoo на Docker)
anaschu 07.07.2026
Увидел в требованиях к вакансии создателя имитационных моделей связку (REst + Api + WMS + Anylogic + питон + 3D Nvideo), и решил посмотреть, что это такое. Из этого всего я работал более менее. . .
Море в объективе
kumehtar 06.07.2026
Хотел написать много проникновенных слов, но передумал. Оно само - говорит. Кто слышит тот слышит.
Doom для терминала без стрельбы и монстров. 3D Raycasting на ascii.
dcc0 05.07.2026
Попросил нейронную сеть deepai. org написать рейкастинг 3D с библиотекой ncurses для Linux. Чтобы можно было ходить на стрелочки. Чтобы стены были отрисованы символами. Справилась. Первый вариант. . .
Установка статуса документа по условию
Maks 05.07.2026
Алгоритм из решения ниже реализован на нетиповом документе "НарядПутевка" разработанного в КА2. Задача: в табличной части "Материалы" документа при записи автоматически устанавливать статус. . .
Сезонность и суточность закисления почв
anaschu 04.07.2026
200 часов это все равно моловато. Есть ситуации, но нестандартные, когда смена происходит за 5 лет. Но обычно это 50 лет и более. Наверное, закисление почвы происходит сезонно в средней. . .
В чем ценность человеческого опыта в глобальном смысле?
kumehtar 03.07.2026
Возможно, ценность человека не в том, что он однажды достигает мудрости, а в том, что он становится носителем карты пути. Он знает не только истину, но и последовательность внутренних изменений,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru