Возможно ли не дублируя в памяти массив сохранить его состояние до и после сортировки? - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Вводные:

1. Есть очень большой одномерный динамический массив. 2. Алгоритм программы требует одновременную работу с его содержимым как в сортированном виде, так и в первоначальном состоянии. 3. Используется сортировка qsort

Вопрос:

Есть ли возможность не дублируя содержимое динамического массива в другой динамический массив выполнять действия над одним массивом в обеих состояниях? Очевидно, что создать массив указателей экономически более целесообразно чем делать дубликат массива size_t, но мои личные эксперименты с указателями не привели к успеху - после сортировки изменяется состояние как основного массива, так и массива указателей на основной. В результате теряется состояние "до сортировки". Просьба подсказать методику и, при возможности, привести примеры кода. Заранее спасибо!

Решение задачи: «Возможно ли не дублируя в памяти массив сохранить его состояние до и после сортировки?»

textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
 
int compare_ints(const void* a, const void* b)
{
    int arg1 = *(const int*)a;
    int arg2 = *(const int*)b;
 
    if (arg1 < arg2) return -1;
    if (arg1 > arg2) return 1;
    return 0;
 
    // return (arg1 > arg2) - (arg1 < arg2); // possible shortcut
    // return arg1 - arg2; // erroneous shortcut (fails if INT_MIN is present)
}
 
int main(void)
{
    int ints[] = { -2, 99, 0, -743, 2, INT_MIN, 4 };
    int size = sizeof ints / sizeof *ints;
 
    qsort(ints, size, sizeof(int), compare_ints);
 
    for (int i = 0; i < size; i++) {
        printf("%d ", ints[i]);
    }
 
    printf("\n");
}

Объяснение кода листинга программы

В данном коде представлена сортировка массива целых чисел с использованием функции qsort(). Функция compare_ints() является пользовательской функцией сравнения, которая определяет порядок элементов при сортировке. Список действий:

  1. #include — подключаем файл стандартного ввода/вывода, который содержит функции для работы с консолью.
  2. #include — подключаем файл стандартной библиотеки, который содержит функции для работы с памятью и алгоритмы.
  3. #include — подключаем файл стандартных пределов, который содержит константы для представления минимального и максимального значений типов данных.
  4. int compare_ints(const void a, const void b) — объявляем функцию сравнения, которая принимает два указателя на целочисленные значения и возвращает результат сравнения.
  5. Внутри функции compare_ints() происходит приведение указателей к целочисленным значениям и сравнение этих значений. Результат сравнения возвращается как -1, 0 или 1.
  6. int main(void) — объявляем основную функцию программы, которая не принимает аргументов.
  7. Внутри функции main() объявляем массив ints[] со значениями -2, 99, 0, -743, 2, INT_MIN, 4.
  8. Вычисляем размер массива с помощью формулы: size = sizeof ints / sizeof *ints.
  9. Используем функцию qsort() для сортировки массива ints[], передавая ей размер массива, указатель на первый элемент массива, размер элемента и указатель на функцию сравнения.
  10. Используем цикл for для вывода отсортированного массива на экран с помощью функции printf().
  11. Выводим символ пробела после каждого числа.
  12. Выводим символ новой строки после завершения цикла. Таким образом, данный код сортирует массив ints[] по возрастанию, используя функцию qsort() и пользовательскую функцию сравнения compare_ints(). После сортировки массив выводится на экран.

Оцени полезность:

12   голосов , оценка 3.667 из 5
Похожие ответы