2016-03-10 3 views
3

Я работаю над программой на C++, в которой мне нужно передать массив для нескольких функций сортировки и сравнить время работы функций. Например, у меня есть массив из 100 элементов, содержащих случайные числа от 1 до 10. У меня есть сортировка пузырьков, сортировка слияния и быстрая сортировка, и я должен передать массив каждой функции. Однако, когда я передаю массив, первая функция сортировки меняет исходный массив, так что когда он передается следующей функции, он уже отсортирован. Ожидается, но мне было интересно, как я буду хранить этот массив в отдельном файле, возможно, в заголовочном файле, чтобы сохранить исходный массив несортированным для каждого вызова функции.C++ Сохранение массива в отдельном файле

Вот схема моего кода:

#include <iostream> 
using namespace std; 

//void bubblesort, mergesort, quicksort function prototypes 

int main() 
{ 
    int a[100]; 
    for (int i = 0; i < 100; i++) 
     a[i] = rand() % 10 + 1; 
    bubblesort(a); 
    mergesort(a); 
    quicksort(a); 
    return 0; 
} 

//void bubblesort, mergesort, quicksort function definitions 

Этот код, очевидно, только расположение и функция сортировки не имеет отношения к этому вопросу, кроме того, что вызов функции сортировки изменяет оригинальный массив. Спасибо за вашу помощь.

+1

Просто скопируйте массив в новую переменную массива каждый раз, когда хотите сортировать. Не нужно сохранять его в файл. Проверьте 'memcpy()' или напишите цикл for. –

ответ

1

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

Поскольку вы отметили этот вопрос на C++, я отвечу на этот вопрос методом C++ (или, по крайней мере, способом стандартной библиотеки C++). Вы хотите сделать копию массива, когда передаете его функции. На данный момент вы передаете необработанный адрес массива, чтобы не создавать копии (возможно, только копию указателя). Этот процесс упрощается, если вы используете vectors. Таким образом, программа может быть

#include <iostream> 
#include <vector> 
using namespace std; 

// The declarations would just need to change to this, I am assuming 
// they print to stdout 
void bubblesort(vector<int> vec); 
void mergesort(vector<int> vec); 
void quicksort(vector<int> vec); 

int main() 
{ 
    vector<int> a; 
    for (int i = 0; i < 100; i++) 
     a.push_back(rand() % 10 + 1); 
    bubblesort(a); 
    mergesort(a); 
    quicksort(a); 
    return 0; 
} 

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

Если, однако, ваша заявка требовала использования низкоуровневых массивов, вы могли бы использовать memcpy для достижения этого эффекта копирования.

#include <iostream> 
#include <vector> 
using namespace std; 

//void bubblesort, mergesort, quicksort function prototypes 

int main() 
{ 
    int a[100]; 
    for (int i = 0; i < 100; i++) 
     a[i] = rand() % 10 + 1); 

    int for_bubble_sort[100]; 
    memcpy(for_bubble_sort, a, 100); 
    bubblesort(for_bubble_sort); 

    int for_merge_sort[100]; 
    memcpy(for_merge_sort, a, 100); 
    mergesort(for_merge_sort); 

    int for_quick_sort[100]; 
    memcpy(for_quick_sort, a, 100); 
    quicksort(for_quick_sort); 
    return 0; 
} 
+0

ваш второй образец кода все еще имеет 'vector' в объявлениях функций – vu1p3n0x

+0

@ vu1p3n0x Спасибо, что указали это! – Curious

+0

Спасибо @ Curious! – tfreiner

-2

Вы можете объявить массив как const, чтобы сохранить его начальное значение, а функции его не меняют.

0

Ну, вы должны сделать другой массив. Скопируйте содержимое исходного массива в это с помощью memcpy() или используйте цикл.