2013-03-28 4 views
0

Мне нужно отсортировать массив тысяч записей. Я помещаю каждую новую запись в нужное место, поэтому мне нужно изменить индекс остальных записей в моем массиве. Я делаю в Мануалах как:копия против ручного копирования массива в C++

db[j]=record; 
    cout<<tmp.oName<<endl; 
    while (j++!=size-1){ 
     tmp2=db[j]; 
     db[j]=tmp; 
     tmp=db[j]; 
    } 

И вот идет мой вопрос: было бы значительно быстрее создать новый массив и использовать копию, или не было бы заметно вычислительное времени и улучшение использования памяти у моего текущего кода? Я довольно новичок в C++, поэтому я не уверен, как эта функция работает внутри.

Включает, я могу использовать:

#include <iostream> 
#include <iomanip> 
#include <string> 
#include <cstring> 
#include <cstdlib> 
#include <cstdio> 
+2

Возможно, вам понадобится 'std: :(​​multi) set'. Он сохраняет элементы отсортированными. – chris

+0

Вы можете подумать, возможно ли использование вашей сортированной емкости, такой как 'std :: set', в вашей ситуации. –

+0

Вы также можете использовать 'std :: vector :: insert', чтобы выполнить это. Он переместит все для вас. – lcs

ответ

2

Если вы сделаете копию массива, затем скопируйте его, он будет медленнее и будет использовать больше памяти.

Скажите, что у вас есть массив с N пятнами, а я - индекс, в котором находится ваш новый предмет. Копирование массива означает, что вы используете N больше памяти и копируете элементы N раз. Если вы просто сдвигаете записи, вы не используете больше памяти и выполняете операции N-I, так как вам нужно только перемещать элементы после нового.

0

Это лучше, чтобы проверить структуры данных STL в вашем case.Try кучного сортировать или быстрой сортировки, если вы не можете использовать STL.

+0

Вам лучше не использовать STL. Вместо этого используйте стандартную библиотеку C++. – 2013-03-28 19:48:42

1

Нет, не было бы быстрого создания нового массива. Однако было бы не использовать пузырьковый вид. Вместо этого используйте что-то вроде быстрой сортировки. Просто google quick sort C++, чтобы увидеть сотню примеров этого.

+0

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

+0

@Phil Автору необходимо поддерживать отсортированный список. Выполнение qsort каждый раз, когда вы вставляете элемент, будет стоить O (n log n). Смещение всех элементов, как говорит автор, будет O (n). – OlivierD

+0

@OlivierD Я понимаю это. Я неправильно понял его вопрос. Его код выглядел так, будто он просто сортировал их снова, не добавляя что-то к середине. Я должен попытаться прочитать его немного осторожнее. – Phil

0

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

FYI:

http://www.algolist.net/Algorithms/Sorting/Quicksort

+0

Я не могу ... взглянуть на комментарии в моем оригинальном посте. – Dworza

+1

@Dworza Извините, я не видел ваших комментариев, когда писал письмо – taocp

1

Похоже, вы пытаетесь создать свой собственный отсортированный список.

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

EDIT:

Это одна из затрат на использование списка на основе массива (в отличие от связанного списка) - вставка занимает линейное время O (N)

1

Если вам это нужно для реальной жизни , используйте STL qsort (http://www.cplusplus.com/reference/cstdlib/qsort/). Если вам это нужно для домашней работы, создание нового массива будет дорогостоящим из-за времени запуска malloc.

+0

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

0

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

0

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

С другой стороны, способ, которым вы описываете вставку, сродни сортировке вставки. Одна операция вставки будет стоить вам O (n).Использование кучи для управления вашим массивом сделает стоимость ввода O (log n), но может быть медленнее для небольших размеров массива. См. http://en.wikipedia.org/wiki/Binary_heap