Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
14 / 7 / 2
Регистрация: 25.03.2014
Сообщений: 90

Оптимальная сортировка без дублирования данных

19.01.2016, 17:33. Показов 2463. Ответов 23

Студворк — интернет-сервис помощи студентам
Прошу помочь написать сортировку, которая позволит рационально расходовать память, избегая дублирования данных. Их может быть очень много. Хотя бы подскажите метод как это сделать с помощью qsort?

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
#include <stdio.h>
#include <stdlib.h>
#include <stddef.h>
#include <time.h>
 
// Правильная сортировка qsort для положительных и отрицательных значений float
int compare (const void * a, const void * b)
{
  float fa = *(const float*) a;
  float fb = *(const float*) b;
  return (fa < fb) - (fa > fb);
}
 
int main(){
 
 // Динамический массив с реальными данными является координатами точек на
 // графике: номер ячейки в массиве - число по оси X; записанные в ячейку
 // данные - число по оси Y.
 // В действительности, реальный массив содержит около 200 миллионов элементов float.
 ptrdiff_t elements_quantity = 1000;
 
 // Выделяем память под динамический массив
 float *x = (float*) malloc(elements_quantity*sizeof(float));
 // Проверка результата выделения памяти
 if ( !x ) {
        printf("Error: can't allocate memory!\n");
        getchar();  //задержка консоли
 }
 
 // Для примера заполним массив случайными данными
 srand(time(0));
 for(ptrdiff_t i=0; i<elements_quantity; i++) {
        x[i]=( rand() % 101 - 50 ) / 10.0;
//        printf("%f\n",x[i]);
 }
 
 // Создадим динамический массив для записи результатов вычислений
 ptrdiff_t *extracts;
 // Размер динамического массива
 ptrdiff_t size_of_extracts = 0;
 // Резервирование первой ячейки под массив
 extracts = (ptrdiff_t*)malloc(sizeof(ptrdiff_t));
 if ( !extracts ) {
    printf("Error: can't allocate memory!\n");
    getchar();  //задержка консоли
 }
 
 // Выполнить некие вычисления над всеми элементами реального массива x[]
 for(ptrdiff_t j=0; j<elements_quantity; j++) {
     // Результат вычислений поместить в виде номеров ячеек массива x[] в другой
     // динамический массив extracts
     if( x[j] >= -2.01 && x[j] <= 2.01 ){
 
         extracts[size_of_extracts] = j;
 
         // Переопределение памяти бОльшего размера
         size_of_extracts++;
         extracts = (ptrdiff_t*) realloc(extracts, sizeof(ptrdiff_t)*size_of_extracts+1);
         if ( !extracts ) {
             printf("Error: can't reallocate memory!\n");
             getchar();  //задержка консоли
         }
     }
 }
 
 // Вывод содержимого массива x[] в соответствие с результатами вычислений, помещённых в extracts[]
 // При работе с реальными данными размер массива extracts[] составляет около 30% от массива x[]
 for(ptrdiff_t k=0; k<size_of_extracts; k++) {
    printf("Номер ячейки в массиве и значение x[%td]=%.2f\n", extracts[k], x[extracts[k]]);
 }
 
 // Тут блок, сортирующий содержимое массива extracts в порядке убывания значений из массива x[]
 // Сортировка через qsort
 //
 // qsort(a, size_of_extracts, sizeof(extracts[0]), compare);
 
 // Вывод после сортировки
 for(ptrdiff_t k=0; k<size_of_extracts; k++) {
    printf("Номер ячейки в массиве и значение x[%td]=%.2f\n", extracts[k], x[extracts[k]]);
 }
 
 // Освобождение выделенной памяти
 free(x);
 free(extracts);
 
 return 0;
 
}
Сборка следующим образом:
Bash
1
gcc -Wall -g -std=c11 -pedantic main.c -o main
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
19.01.2016, 17:33
Ответы с готовыми решениями:

Вывод данных в таблицу без дублирования
КАРОЧ! как вывести с двух таблиц в один грид данные,чтобы они не дублировались при выводе? HELP PLEASE.

Защита от дублирования лайков без регистрации
Есть материалы которые могут оценивать пользователи (лайк,дизлайк) не могу решиться как реализовать защиту от дублирование лайков. Выдавать...

Выполнение функции по без дублирования по нажатию
Привет, всем! Помогите пожалуйста. Есть на сайте radio. &lt;span dtitle=&quot;kid&quot; class=&quot;tooltipstered&quot;&gt;&lt;input...

23
14 / 7 / 2
Регистрация: 25.03.2014
Сообщений: 90
28.02.2016, 15:19  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от HighPredator Посмотреть сообщение
size_t -- это итерирование циклов в положительной области и индексация массивов
Какой тип использовать для ревесного цикла в большом массиве индексов? Я столкнулся с нешуточной проблемой
“invalid controlling predicate”
при использовании OpenMP. Все трюки, подробно описанные для size_t не помогают.
C
1
2
#pragma omp parallel for
        for(size_t i=max_elements_quantity-1; i >= 0; --i)
0
 Аватар для HighPredator
6045 / 2160 / 753
Регистрация: 10.12.2010
Сообщений: 6,005
Записей в блоге: 3
28.02.2016, 15:49
Loinch, весь цикл покажите. Уже не надо. Согласно спекам опенмп, переменная цикла, чтобы оно работало, должна быть любого целого знакового типа.
0
14 / 7 / 2
Регистрация: 25.03.2014
Сообщений: 90
28.02.2016, 16:37  [ТС]
HighPredator, обратно к ptrdiff_t? Или есть более правильный вариант для подобных случаев под x64?
0
 Аватар для HighPredator
6045 / 2160 / 753
Регистрация: 10.12.2010
Сообщений: 6,005
Записей в блоге: 3
28.02.2016, 16:53
Loinch, это как вы решите. Поскольку опенмп накладывает свои требования к архитектуре, структуре и логике программы, вам нужно определиться с этим конкретным фрагментом. Если вы точно хотите кормить его опенмп, тогда меняйте. Если же нет, то оставляйте как есть.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
28.02.2016, 16:53

Поиск и оптимальная сортировка в datagridview
имеется сортировка в datagridview но она слишком простая, может кто нибудь знает посложнее? Dim Col As...

Оптимальная сортировка для средних массивов
Доброго, к сожалению не очень шарю в разных методах сортировки, потому хочу спросить, какую сортировку лучше выбрать для массива, длина...

Оптимальная видеокарта для i7 4790 (без K)
Посоветуйте самую оптимальную видеокарту для i7 4790. Чтобы полностью раскрывали друг друга.

Добавления даных из одной таблицы в другую без дублирования
Задача: добавить данные из таблицы Т2 в таблицу Т1, идентичные по структуре, но при этом избежать возможные дубли. Особенность в том, что...

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


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

Или воспользуйтесь поиском по форуму:
24
Ответ Создать тему
Новые блоги и статьи
Запустил конкурс "тем и промптов для текстовых квестов созданных почти чисто ИИ"
Adler 06.10.2026
Всем привет! За последние три-четыре дня я создал более 16 текстовых квестовых игр используя преимущественно по одному запросу к ИИ на игру. Мне так понравилось смотреть все ветки/ сцены во всех. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru