2010-11-30 2 views
3

Как я могу правильно увеличить стек, доступный для программы, используя Bloodshed Dev C++ или Code :: Block? Я запускаю простой пузырь и быстро сортирую, но работаю, но когда я сменил стек в Code :: Block (узнал, как он превысил here), это сделало мою программу еще быстрее, несмотря на использование гораздо большего, чем предполагалось, места. изначально программа разбивалась при сортировке 64K случайных целых чисел (с использованием функции rand()). Теперь его сбой при 32K. im получение ошибки: Process returned -1073741571 (0xC00000FD)Увеличение стека не работает

программа действительно работает быстрее, не изменив стек, предполагая, что я делаю это правильно. gcc -Wl,--stack,1099511627776

я не могу понять, как изменить его на всех в Dev C++

Что я должен делать? есть ли способ изменить стек внутри самого кода? вот код im, использующий для пузыря и быстрого сортировки. есть два из них: один с векторами, другой - с массивами. Я думаю, что пузырь сорт. должно быть правильным. быстрый сорт, я не так уверен. извините, если его немного грязный

vector <int> v_bubble(vector <int> array){ 
    // Vector Bubble Sort 
    if (array.size() < 2){ 
     return array; 
    } 
    int s = 1; 
    while (s){ 
     s = 0; 
     for (unsigned int x = 0; x < (array.size() - 1); x++){ 
      if (array[x] > array[x + 1]){ 
       int t = array[x]; 
       array[x] = array[x + 1]; 
       array[x + 1] = t; 
       s = 1; 
      } 
     } 
    } 
    return array; 
} 

void a_bubble(int array[], int size){ 
    // Array Bubble Sort 
    int s = 1; 
    while (s){ 
     s = 0; 
     for (int x = 0; x < (size - 1); x++){ 
      if (array[x] > array[x + 1]){ 
       int t = array[x]; 
       array[x] = array[x + 1]; 
       array[x + 1] = t; 
       s = 1; 
      } 
     } 
    } 
} 

vector <int> v_quick(vector <int> array){ 
    //Vector Quick Sort 
    if (array.size() < 2){ 
     return array; 
    } 
    vector <int> left; 
    vector <int> right; 
    int p_location = array.size()/2 - 1; 
    int pivot = array[p_location]; 
    for(unsigned int x = p_location; x < array.size() - 1; x++){ 
     array[x] = array[x + 1]; 
    } 
    array.pop_back(); 
    for(unsigned int x = 0; x < array.size(); x++){ 
     if (array[x] <= pivot) { 
      left.push_back(array[x]); 
     } 
     else if (array[x] > pivot){ 
      right.push_back(array[x]); 
     } 
    } 
    vector <int> p; 
    p.push_back(pivot); 
    return combine(combine(v_quick(left), p), v_quick(right)); 
} 

int a_quick(int array[], int size, int l_index = -1, int r_index = -1){ 
    //Array Quick Sort 
    if (size < 2){ 
     return array[size]; 
    } 
    array[size] = array[size]; 
    int left[size]; 
    int right[size]; 
    l_index = 0; 
    r_index = 0; 
    int p_location = size/2 - 1; 
    int pivot = array[p_location]; 
    for(int x = p_location; x < size - 1; x++){ 
     array[x] = array[x + 1]; 
    } 
    size--; 
    for(unsigned int x = 0; x < size; x++){ 
     if (array[x] <= pivot) { 
      left[l_index] = array[x]; 
      l_index++; 
     } 
     else if (array[x] > pivot){ 
      right[r_index] = array[x]; 
      r_index++; 
     } 
    } 
    return a_quick(left, l_index, l_index, r_index) + pivot + a_quick(right, r_index, l_index, r_index); 
} 

остальная часть кода просто генерировать массивы и векторы с 32, 64 и 128 к записи, сортируя их, используя код выше и возвращение времени. что часть им вполне уверены, что я не завинчивать

моих главным в основном только

start = clock(); 
    a_quick(array1, 32000); 
    end = clock(); 
    cout << "\nQuick Sort\tArray\t32000\t" << ((double) end - start)/CLOCKS_PER_SEC << " seconds\n"; 

снова и снова

+2

Как вы реализовали эти алгоритмы? Правильная реализация сортировки пузырьков не должна быть рекурсивной, и для корректной рекурсивной реализации Quicksort требуется средняя глубина O (lg n) в стеке вызовов (наихудшая сложность пространства технически линейна, если вы не можете выбрать хорошие значения поворота или у вас действительно есть порочные данные).Если у вас заканчивается нехватка места в стеке с помощью рекурсивного алгоритма, лучше всего переделать его в итеративной форме или подделать рекурсию, используя свой собственный стек, который вы можете выделить в куче. – 2010-11-30 02:48:37

+0

Я думаю, что сделал пузырь сорта права. быстрый вид, который я только что узнал сегодня, поэтому я не очень уверен в этом. в моих инструкциях hw, в нем говорится, что мне нужно будет изменить стек. – calccrypto 2010-11-30 02:53:45

+0

. Вы не можете показать, что функции, которые вы показываете, вызывают нехватку места в стеке. Ни один из них не вызывает никаких функций, и ни один из них не выделяет большие объекты в стеке. – 2010-11-30 02:58:12

ответ

6

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

Уход за публикацией кода?

1

В функции int a_bubble(int array[], int size): вы возвращаете array[size], то есть вне границ. То же самое верно для a_quick().

И отправьте также свой main().

EDIT: нет, он возвращает элемент после последний элемент массива. Некоторые могут сказать, что даже доступ к нему - UB, и они будут правы.

Это отладочная сборка, в которой вы работаете? Я думаю, что код ошибки соответствует «исключенному исключению», но я не понимаю, почему он должен быть настолько загадочным.

EDIT2: это хуже. Что означает int array[1 << 20]? Старая версия была в порядке, вам просто нужно было удалить return array[size]. Сделайте возвращаемые функции void, у вас уже есть как массив, так и его размер в объявлении.

Смежные вопросы