Модераторы: Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [C++Builder]Разновидность сортировки QuickSort, Переписать код из делфи в с++ билдер 
V
    Опции темы
lansel
Дата 5.9.2008, 13:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 3.1.2006

Репутация: нет
Всего: нет



Помогите правильно переписать данный код в с++. Вообщем то я почти сделала это, но у меня возникли проблемы с памятью, не сортирует большие элементы (такие как  в рандоме) и особенно если их много напимер больше 10000.
Как правильно будет в с++: 
1)  Const M=30; s: 0..M; ??
2)  stek: Array [1..M] of Record L,R:integer

Вот сам код:
Код

Const n=101; // чем больше тем лучше!
 Type tipkey=integer; tip=Record key:tipkey; end;
 Var X:Array[0..n-1]of tip;
         z,zz:integer; // счетчики 

 Procedure QuickSt1 (Var X:Array of tip);
  Const M=30;
  Var i,j,L,R: integer; w: tip; s: 0..M; xx:tipkey;
      stek: Array [1..M] of Record L,R:integer end;
  begin s:= 1; stek[1].L:= 0; stek[1].R:= High(X);
   Repeat L:= stek[s].L; R:= stek[s].R; s:= s-1;
    Repeat i:= L; j:= R; xx:= X[(L+R) div 2].key;
     Repeat {Inc(z);} While X[i].key < xx do begin {Inc(z);} Inc(i)end;
            {Inc(z);} While xx < X[j].key do begin  {Inc(z);} Dec(j) end;
      If i < j then begin w:= X[i]; X[i]:= X[j]; X[j]:= w; Inc(i); Dec(j) end
      Else If i = j then begin Inc(i); Dec(j) end
     Until i > j;
     If i < R then begin s:= s+1; stek[s].L:= i; stek[s].R:=R end;
     R:= j
    Until L >= R
   Until s = 0
  end;

procedure TForm1.Button10Click(Sender: TObject);
 VAr i,j:integer; t:cardinal;
begin
Randomize; zz:=0; z:=0; t:=GetTickCount;
 For i:= 1 to m do
 begin For j:=0 to n-1 do X[j].key:= Random(100000000);
 QuickSt1(X)
 end;
 Memo1.text:=IntToStr(zz)+'  '+ FloatToStr(GetTickCount-t)
+'  '+ FloatToStr(n*(ln(n)/Ln(2))+n/2)
end;


                          
PM MAIL   Вверх
Mazzi
Дата 5.9.2008, 14:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Правильный
**


Профиль
Группа: Комодератор
Сообщений: 825
Регистрация: 3.4.2003

Репутация: нет
Всего: 21



правильно будет в с++: 
1)  Const M=30; s: 0..M; ??
Код

#define M    30
int s;
typedef struct rec{int L; int R;};
rec stack[M];


2)  stek: Array [1..M] of Record L,R:integer

Добавлено через 1 минуту и 26 секунд
Все массивы в С++ начинаются с нуля!

Удачи!


--------------------
Мне нужны помощники.
PM MAIL WWW   Вверх
lansel
Дата 5.9.2008, 14:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 3.1.2006

Репутация: нет
Всего: нет



Mazzi, спасибо!
PM MAIL   Вверх
lansel
Дата 9.9.2008, 13:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 3.1.2006

Репутация: нет
Всего: нет



а что делать с сортировкой большого размера ключей??? не сортирует же :(
PM MAIL   Вверх
Mazzi
Дата 9.9.2008, 13:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Правильный
**


Профиль
Группа: Комодератор
Сообщений: 825
Регистрация: 3.4.2003

Репутация: нет
Всего: 21



А с малым размером сортирует?

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


--------------------
Мне нужны помощники.
PM MAIL WWW   Вверх
lansel
Дата 9.9.2008, 14:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 3.1.2006

Репутация: нет
Всего: нет



сортирует не больше 10000 ключей размером не больше 1000000 :(
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.0752 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.