Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.11.2012, 16:49   #1
CrOsP
Пользователь
 
Регистрация: 31.05.2009
Сообщений: 26
По умолчанию Сортировка массива по длине строк и по алфавиту

Здравствуйте , есть задание отсортировать массив 1. По длине строк 2.По алфавиту

Для начала есть пару вопросов , если элемент массива будет состоять из нескольких символов допустим "амфсф" оно будет сортировать по первому символу или проходиться по всем если состоит из нескольких символов или для этого надо будет отдельно писать процедуру ?

Вот попробовал сделать сортировку по алфавиту
Но не совместимость типов Чар и Стринг
Если х присвоить чар , то тогда будет тоже ошибка , так как элементов может быть несколько
Код:
procedure TForm1.N2Click(Sender: TObject);
var a:tarraystring; i,j,n:integer; x,s:string;
begin
getArrayFromMemo2(a,n,memo1) ;
for i:=1 to n do
for j:=i+1 to n do
if s[i]>s[j] then
 begin
  x:=s[i];
  s[i]:=s[j];
  s[j]:=x;
 end;
 end;
Подскажите пожалуйста как реализовать ?
Еще вопрос , сортироваться будет по номеру символа ?

И подскажите как реализовать сортировку по длине строки ?
Спасибо заранее.

Попробовал сделать с длиной
но запутался с выводом
Поправьте пожалуйста
Код:
procedure TForm1.N2Click(Sender: TObject);
var a:tarraystring; i,j,n:integer; x,s:string;
begin
getArrayFromMemo2(a,n,memo1) ;
Memo1.Clear;
for i:=1 to n-1 do
for j:=i+1 to n do
if length(a[j])<length(a[i]) then
 begin
  x:=a[i];
  a[i]:=a[j];
  a[j]:=x;
  Memo1.Lines.Append(a[i]);
 end
 else
 Memo1.Lines.Append(a[i]);
 Memo1.Lines.Append(a[j]);
 
 end;
CrOsP вне форума Ответить с цитированием
Старый 04.11.2012, 21:26   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

во-первых, если используете НЕСТАНДАРТНЫЕ типы данных и процедуры по их обработке, желательно приводить в сообщении их исходные коды! (это я про tarraystring и getArrayFromMemo2 )

во-вторых, если допустить, что процедура getArrayFromMemo2 работает корректно, то я бы предложил такой примерно код:
Код:
procedure TForm1.N2Click(Sender: TObject);
var a:tarraystring; 
   i,j,n:integer; 
   x:string;
begin
  getArrayFromMemo2(a,n,memo1) ;

  {начали сортировку по длинам строк}  
  for i:=1 to n-1 do
    for j:=i+1 to n do
      if length(a[j])<length(a[i]) then
      begin
         x:=a[i];
         a[i]:=a[j];
         a[j]:=x;
      end;
   {закончили сортировку}

   {выведем полученный массив в Memo1}
   Memo1.Clear;
   for i:=1 to n do
      Memo1.Lines.Append( a[i] );
 end;
p.s. если Вы замените всего ОДНУ строчку:
Код:
if length(a[j])<length(a[i]) then
на строчку:
Код:
if a[j]<a[i] then
то получите сортировку по алфавиту!

Последний раз редактировалось Serge_Bliznykov; 04.11.2012 в 21:29.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 04.11.2012, 21:59   #3
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,645
По умолчанию

Задача отсортировать именно массив или то что в memo?
Если это не академическая задача и способ не важен, то ещё один способ - обратиться к родительским методам. Я обычно до TList спускаюсь, но можно и так:
Код:
function StringListCompareLengtnStrings(List: TStringList; Index1, Index2: Integer): Integer;
begin
  Result := length(List.Strings[Index1]) - length(List.Strings[Index2]);
  //результат (точнее знак +-) используется в быстрой сортировке
  //Чтобы понять что да как, можно глянуть в модуль Classes на процедуру
  //procedure TStringList.QuickSort(L, R: Integer; SCompare: TStringListSortCompare);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  a: TStringList;
begin
  a := TStringList.Create;
  a.Assign(memo1.Lines);
  a.CustomSort(@StringListCompareLengtnStrings);//пользовательская сортировка
  memo1.Lines.Assign(a);
  showmessage('следующая сортировка');
  a.Assign(memo1.Lines);
  a.Sort;//стандартная сортировка по алфавиту
  memo1.Lines.Assign(a);
  a.Destroy;
end;
eoln вне форума Ответить с цитированием
Старый 05.11.2012, 00:36   #4
CrOsP
Пользователь
 
Регистрация: 31.05.2009
Сообщений: 26
По умолчанию

СПАСИБО огромное !! Просто запутался в выводе !!
CrOsP вне форума Ответить с цитированием
Старый 05.11.2012, 00:53   #5
CrOsP
Пользователь
 
Регистрация: 31.05.2009
Сообщений: 26
По умолчанию

Извините пожалуйста , а как нужно исправить чтобы сортировка была методом вставки ?
CrOsP вне форума Ответить с цитированием
Старый 05.11.2012, 01:02   #6
CrOsP
Пользователь
 
Регистрация: 31.05.2009
Сообщений: 26
По умолчанию

Сам сделал , спасибо еще раз за помощь !
Код:
procedure TForm1.N2Click(Sender: TObject);
var a:tarraystring; i,j,count:integer; x:string;
begin
getArrayFromMemo2(a,count,memo1) ;
Memo1.Clear;
for i :=  2 to count do
begin
				// Сравниваем элементы на границе между
				// упорядоченной и неупорядоченной частями массива
				if length(a[i]) < length(a[i-1])  then
				begin
      					// Порядок нарушен, запоминаем i-й элемент
						x := a[i];
      					// Начинаем цикл сдвигов вправо на  место i-го элемента
						j := i;	// j - индекс вакантного места
      					repeat
									// сдвигаем вправо
        								a[j]:=a[j-1];
        								j:=j-1;
									// пока слева не появилось меньшее число,
									// или дошли до начала массива
      					until (j = 1) or (length(a[j-1]) <= length(x));
						//'Теперь вставим бывший i-й элемент на новое место с индексом  j
						a[j] := x;
          		end;
  		end;

 Memo1.Clear;
   for i:=1 to count do
      Memo1.Lines.Append( a[i] );
 end;

procedure TForm1.N3Click(Sender: TObject);
var a:tarraystring; i,j,count:integer; x:string;
begin
getArrayFromMemo2(a,count,memo1) ;
Memo1.Clear;
for i :=  2 to count do
		begin
				// Сравниваем элементы на границе между
				// упорядоченной и неупорядоченной частями массива
				if a[i] < a[i-1]  then
				begin
      					// Порядок нарушен, запоминаем i-й элемент
						x := a[i];
      					// Начинаем цикл сдвигов вправо на  место i-го элемента
						j := i;	// j - индекс вакантного места
      					repeat
									// сдвигаем вправо
        								a[j]:=a[j-1];
        								j:=j-1;
									// пока слева не появилось меньшее число,
									// или дошли до начала массива
      					until (j = 1) or (a[j-1] <= x);
						//'Теперь вставим бывший i-й элемент на новое место с индексом  j
						a[j] := x;
          		end;
              end;
Memo1.Clear;
   for i:=1 to count do
      Memo1.Lines.Append( a[i] );
end;
CrOsP вне форума Ответить с цитированием
Старый 07.09.2013, 12:07   #7
Ирина Андреевна Пс
Пользователь
 
Регистрация: 05.05.2013
Сообщений: 11
По умолчанию

а можно тоже самое для длин строк только с шейкерной сортировкой!
Ирина Андреевна Пс вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сортировка массива char по алфавиту iHikita Помощь студентам 1 25.05.2010 13:10
Сортировка строк по алфавиту yugik Общие вопросы C/C++ 4 21.05.2010 14:01
Сортировка строк по алфавиту Tsvetochek Microsoft Office Excel 2 10.05.2010 21:43
сортировка списка строк по алфавиту -GT- Общие вопросы C/C++ 0 26.11.2009 20:27
Сортировка строк по алфавиту в структуре с помощью указателей Anarki Общие вопросы C/C++ 2 23.10.2009 19:36