Форум программистов, компьютерный форум, киберфорум
Наши страницы
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Agrestid
0 / 0 / 0
Регистрация: 26.10.2015
Сообщений: 16
#1

Как отсортировать список быстрой сортировкой (без использования массива)? - Delphi

30.11.2015, 16:16. Просмотров 684. Ответов 26
Метки нет (Все метки)

Здравствуйте
Подскажите,как отсортировать список быстрой сортировкой без загона его в массив?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.11.2015, 16:16
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Как отсортировать список быстрой сортировкой (без использования массива)? (Delphi):

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

На базе массива создать кольцевой список, отсортировать его, вывести содержание списка на форму
Вот задание: Работа с динамическими структурами Дан массив . Работа с...

Как написать сумму прописью. Без использования fastreport?
Как написать сумму прописью. Без использования fastreport? Например 101.20...

Как определить за какое время выполняется программа без использования TimeToStr?
есть ли софт или еще что-то чтобы узнать за сколько времени прога выполнилась и...

Компонент для быстрой работы с Excel без OLE
Добрый день! Кто подскажет какие есть компоненты которые позволяют быстро...

Вопрос с сортировкой массива
Помогите понять мою ошибку. Я начинающий, весь день пробую написать и что-то...

26
Kitayets
334 / 288 / 102
Регистрация: 09.09.2011
Сообщений: 1,017
01.12.2015, 11:29 #21
ну списки (классические) не сортируют, т.к. для сортировки нужен доступ к элементу по индексу (во всяком случае для быстрой сортировки). Ну наверно можно, но будет не эффективно.
Например 1-ый шаг в быстрой сортировке - взять "средний" элемент, т.е. при длине N - это будет элемент a[N div 2], для классического списка, это выльется в
1. выяснить сколько всего кол-во элементов в списке - пройти по всему списку и подсчитать (o(n))
2. перейти на "средний" элемент - перебрать n div 2 элементов с начала списка

По этому - для быстрой сортировки - создать массив указателей на индексируемый элемент списка - отсортировать его (массив указателей) - осуществлять упорядоченный доступ к содержимому списка через этот массив указателей. но при любом изменения списка - массив придется перестраивать. Так примерно осуществляется сортировка в базах данных.

Либо построить 2-ой отсортированный список из 1-го - сортировкой вставками например, но после любого изменения списка - надо опять сортировать.
0
krapotkin
3297 / 2937 / 1015
Регистрация: 14.04.2014
Сообщений: 14,263
Записей в блоге: 13
01.12.2015, 14:34 #22
при чем тут массив???
сортируем записи в списке
список - это список ССЫЛОК на записи, но не массив записей
поменять местами нужно будет 4 байта ссылки, а не фигачить туда-сюда всю запись

Добавлено через 11 минут
списки имеются в виду не классические цепочки, а TList
0
Yaro Rozhnov
0 / 0 / 0
Регистрация: 30.11.2015
Сообщений: 4
01.12.2015, 16:15 #23
1917?
0
krapotkin
3297 / 2937 / 1015
Регистрация: 14.04.2014
Сообщений: 14,263
Записей в блоге: 13
01.12.2015, 20:50 #24
1895 )
0
Agrestid
0 / 0 / 0
Регистрация: 26.10.2015
Сообщений: 16
09.12.2015, 08:08  [ТС] #25
как можнозаписать в файл список списков?
я попробовал вот так,но безрезультатно
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
procedure writetofile;
var h:TableP ;
  begin
    AssignFile(f,'f.txt');
    Rewrite(f);
    h:=head;
    while h<>nil do begin
      write(f,h^.t);
      h:=h^.next;
    end;
    CloseFile(f);
    writeln(ToRus('записано в файл'));
  end;
end.
Переменные:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
actorsP=^Actors;
  table = record
    s: string[20];
    a: actorsP;
     lasta:actorsP;
    end;
        FF=file of table;
    Actors = record
      F: string[20];
      next: actorsP;
 
    end;
    TableP= ^Dtable;
    Dtable= record
      T: table;
      next: TableP;
    end;
    var head,last,p:TableP;
        pa:actorsP;
        Tb:table;
        f:FF;
0
krapotkin
3297 / 2937 / 1015
Регистрация: 14.04.2014
Сообщений: 14,263
Записей в блоге: 13
09.12.2015, 12:27 #26
в файл нужно писать по очереди каждую запись. Для этого логично было бы использовать цикл
при этом его ссылка на другой элемент не нужна, так как область памяти, на который он указывает, совершенно случайная и применить эти данные потом совершенно не к чему...

наиболее правильный вариант -
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
TActor = class
   name: string;
   year: integer;
   procedure SaveToStream(st:TStream);
   procedure LoadFromStream(st:TStream);
end;
 
list:TObjectList;
act:TActor;
fs:TFileStream;
i:integer;
 
list:=TObjectList.Create(true);
 
act:=TActor.Create;
act.Name := 'Fred Astaire';
act.Year := 1899;
list.add(act);
act:=TActor.Create;
act.Name := 'Ginger Rodgers';
act.Year := 1911;
list.add(act);
 
fs:=TFileStream.Create('1.dat', fmCreate);
for i:=0 to list.Count-1 do
  (list[i] as TActor).SaveToStream(fs);
freeandnil(fs);
 
freeandnil(list);
0
Agrestid
0 / 0 / 0
Регистрация: 26.10.2015
Сообщений: 16
12.12.2015, 15:13  [ТС] #27
а считать из файла?
я делаю так,но на первом цикле он срывается
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
 procedure ChetenieF;
            procedure Dobavlenie_AF;
    begin
        if p^.t.a = nil then
        begin
          new(pa);
          read(f,pa^.f);
          p^.t.a := pa;
          p^.t.lasta := pa;
          pa^.next := nil;
        end
        else
        begin
          New(pa);
          Read(f,pa^.f);
          while p^.t.lasta^.next <> nil do
            p^.t.lasta := p^.t.lasta^.next;
          p^.t.lasta^.next := pa;
          pa^.next := nil;
        end;
    end;
 
    begin
      AssignFile(f,'f1.txt');
      reset(f);
      while not Eof do
      begin
            if head = nil then
    begin
 
      New(p);
      Readln(f,p^.t.s);
        while not eoln(f) do
            Dobavlenie_AF;
   head := p;
      last := p;
      p^.next := nil;
    end
    else
    begin
 
      new(p);
        Readln(f,p^.t.s);
 
 
         while not eoln(f) do
            Dobavlenie_AF;
 while last^.next <> nil do
    last := last^.next;
  last^.next := p;
  p^.next := nil;
end;
 
 
end;
      Writeln('schitano');
    end;
0
12.12.2015, 15:13
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.12.2015, 15:13
Привет! Вот еще темы с решениями:

Метод быстрой сортировки массива
Помогите пожалуйста. Как мне вызвать процедуру быстрой сортировки через кнопку?...

Нужно быстрой сортировкой отсортировать массив из 20 элементов чтобы первые 10 шли по возрастанию а последние
Нужно при помощи быстрой сортировки отсортировать массив из 20 элементов чтобы...

Как отсортировать записи в файле по заданным полям без использования масссива?
Помогите пожалуйста с сортировкой Файла записей. Так как по условию файл не...

Подскажите пожалуйста с сортировкой (отсортировать список лиц по алфавиту)
Подскажите пожалуйста. Есть список лиц, например: Иванов Сергей Сергеев Петр...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
27
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru