IPB
ЛогинПароль:

> Внимание!

1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным.
В описании темы указываем язык!!!

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

> проблема с сортировкой, c++
сообщение
Сообщение #1


Знаток
****

Группа: Пользователи
Сообщений: 306
Пол: Мужской
Реальное имя: Евгений

Репутация: -  0  +


Возникла проблема с сортировкой, суть которой заключается в следующем:
допустим, наш изначальный массив 3 7 4 1 8 3 3 5 9 1. Строится бинарное дерево, на следующий уровень идут
3 1 3 3 1, то есть соседние числа сравниваются, дальше идет наименьший элемент.
Следующие уровни: 1 3 1,
1 1
1
В конце остаётся 1, она отправляется в отсортированный массив (в данном случае на первое место), а из начального массива отбрасывается (заменяется на бесконечность).
Вобщем, в этом суть, преподаватель назвал его "турнирной" сортировкой, но это явно не "пирамидальная-турнирная-HeapSort" сортировка, преведённая на форуме.
Вот мой код:

#include <iostream>
#include<conio.h>
#include <windows.h>
#include <math.h>
using namespace std;

int xe;
int temp[1000], buff[1000];

int stTwo(int size)
{
int k=0;
while (pow(2,k)<size)
k+=1;
return k;
}


void TurnirSort(int *a, long size, int st, int li)
{
int cl = size;
int S = li;
for (int i=0; i<S; i++)
buff[i]=a[i];

while(cl != 1)
{

for (int i=0,j=0;i<cl; i+=2,j++)
{
if (buff[i]>buff[i+1])
temp[j]=buff[i+1];
else temp[j]=buff[i];
}
cl = li/2;
li = cl;

for (int i=0; i<cl; i++)
buff[i]=temp[i];

for (int i=0; i<cl; i++)
if(buff[i] == 0) buff[i] = 1000;


}

xe = temp[0];


for (int i=0; i<size;i++)
if (a[i] == xe)
{
a[i] = 1000;
break;
}



}



int main()
{
srand(time(NULL));
int ch,size,l, h, st, li;

cout<<"Please, enter the size of massive to sort!"<<endl;
cin>>size;
cout<<"Please, enter the down border!"<<endl;
cin>>l;
cout<<"Please, enter the up border!"<<endl;
cin>>h;

int a[size];
int vec_sort[size];

st = stTwo(size);
li = (int)pow(2,st);


for(int i=0;i<size;i++)
{
a[i]=l+rand()%(h-l);
}
for (int i=size; i<li;i++)
{
a[i] = 1000;
}

for(int i=0;i<size;i++)
{
cout<<a[i]<<" ";
}
cout << endl << endl;



long time = GetTickCount();

for(int i=0; i<size; i++)
{
TurnirSort(a,size,st,li);
vec_sort[i] = xe;
}
time = GetTickCount()-time;

for(int i=0;i<size;i++)
{
cout<<vec_sort[i]<<" ";
}
cout << endl << endl;
getch();
cout<<"time = "<<time<<endl;
getch();

}


Тестировал я её на масивах в 10 элементов, всё четко работало и работает, а вот, когда перешёл к практике(массив в 100 элементов), возникла ошибка - тупо выкидывает из программы... в чём проблема?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
сообщение
Сообщение #2


Знаток
****

Группа: Пользователи
Сообщений: 306
Пол: Мужской
Реальное имя: Евгений

Репутация: -  0  +


Вот реализация двух других известных методов сортировки, реализованных "под одной крышей" - сортировка Шелла и Быстрая сортировка:

#include<iostream>
#include<conio.h>
#include<windows.h>

using namespace std;

int increment(long inc[], long size) {
int p1, p2, p3, s;

p1 = p2 = p3 = 1;
s = -1;
do {
if (++s % 2) {
inc[s] = 8*p1 - 6*p2 + 1;
} else {
inc[s] = 9*p1 - 9*p3 + 1;
p2 *= 2;
p3 *= 2;
}
p1 *= 2;
} while(3*inc[s] < size);

return s > 0 ? --s : 0;
}

void ShellSort(int *a, long size)
{

long inc, i, j, k = 0, seq[40];
int s;

s = increment(seq, size);

while ( s >= 0)
{

inc = seq[s--];

for (i = inc; i < size; i++)
{
int temp = a[i];

for (j = i-inc; (j >= 0) && (a[j] > temp); j -= inc)
a[j+inc] = a[j];
a[j+inc] = temp;
}

/* for(int i=0;i<size;i++)
{
cout<<a[i]<<" ";
}

cout << endl << endl;*/

}
}


void Q_Sort(int *a, long size)
{

long i = 0, j = size;
int temp, p;

p = a[ size>>1 ];

do
{
while ( a[i] < p ) i++;
while ( a[j] > p ) j--;

if (i <= j)
{
temp = a[i]; a[i] = a[j]; a[j] = temp;
i++; j--;
}
}
while ( i<=j );


if ( j > 0 ) Q_Sort(a, j);
if ( size > i ) Q_Sort(a+i, size-i);
}



int main() {

while(true)
{
int ch,size,l, h;

cout<<"Please, enter the size of massive to sort!"<<endl;
cin>>size;
cout<<"Please, enter the down border!"<<endl;
cin>>l;
cout<<"Please, enter the up border!"<<endl;
cin>>h;

int *a = new int[size];
int *b = new int[size];

float time, time_1 = 0, time_2 = 0;

for (int j = 0; j < 100; j++)
{

for(int i=0;i<size;i++)
{
a[i] = l+rand()%(h-l);
b[i] = a[i];
}

time = GetTickCount();

/* for(int i=0;i<size;i++)
{
cout<<a[i]<<" ";
}

cout << endl << endl;*/

ShellSort(a, size);

/* for(int i=0;i<size;i++)
{
cout<<a[i]<<" ";
}

cout << endl << endl;*/

time_1 = time_1 + (GetTickCount()-time);

time = GetTickCount();
Q_Sort(b, size);
time_2 = time_2 + (GetTickCount()-time);



}


cout<<"Shell's Sort Time:"<<time_1/100<<endl;

cout<<"Quick's Sort Time:"<<time_2/100<<endl;


delete a;
delete b;

ch = getch();
if (ch==27) exit(1);
else system("cls");


}
}


Проблема заключается в том, что при размере массива в диапазоне от 1000 и примерно до 10000, к примеру 3000, на этапе вывода среднего времени происходит вылет из программы, с размерность же меньше 1000 и на больших размерах, скажем 30000 и т.д. всё работает... С чем это связано?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Сообщений в этой теме
Rocket   проблема с сортировкой   2.03.2009 1:05
volvo   В вылете за пределы массива... Вот тут: // Чему з…   2.03.2009 1:17
Rocket   В вылете за пределы массива... Вот тут: [code=cp…   2.03.2009 2:06
volvo   Может и есть... По мне - так оно и не надо. Очень …   2.03.2009 2:46
Rocket   Может и есть... По мне - так оно и не надо. Очень…   2.03.2009 3:14
volvo   С большой степенью вероятности - GCC, у меня тоже …   2.03.2009 4:03
Rocket   очень может быть, что при быстром компьютере все t…   2.03.2009 5:02
Rocket   Добавил вывод массивов: начального, промежуточного…   17.03.2009 3:26
volvo   Чего ж непонятные? Все понятно... Что просил - то …   17.03.2009 4:32
Rocket   Чего ж непонятные? Все понятно... Что просил - то…   17.03.2009 15:15
volvo   Ага... Ты массив buff инициализируешь некорректно.…   17.03.2009 15:27
Rocket   Ага... Ты массив buff инициализируешь некорректно…   18.03.2009 3:03
volvo   Ты забыл инициализировать массив temp нулями, лучш…   18.03.2009 3:45
Rocket   Вот реализация двух других известных методов сорти…   24.03.2009 1:32
volvo   Размер = 3000, ничего не вылетело. Что я делаю не …   24.03.2009 1:39
Rocket   Размер = 3000, ничего не вылетело. Что я делаю не…   24.03.2009 1:55
volvo   CodeGuard нашел проблему: void Q_Sort(int *a, lon…   24.03.2009 2:42
Rocket   CodeGuard нашел проблему:А как тогда это исправить…   24.03.2009 2:49
volvo   А подумать? void Q_Sort(int *a, long size) { long…   24.03.2009 3:09


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 27.05.2024 22:03
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name