Форум программистов, компьютерный форум, киберфорум
Наши страницы
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
Rimean
0 / 0 / 0
Регистрация: 23.11.2016
Сообщений: 27
1

Быстрая сортировка

05.07.2017, 22:08. Просмотров 680. Ответов 31
Метки нет (Все метки)

необходимо создать код,который будет производить сортировку массива по убыванию или возрастанию методом быстрой сортировки в среде делфи
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.07.2017, 22:08
Ответы с готовыми решениями:

Быстрая сортировка
написал прогу с двумя видами сортировки... проблема в том что в второй варианте...

Быстрая сортировка
Как в бстрой сортировке сделать построчный вывод отсортированныз значений...

Быстрая сортировка.
Написать программу, сортирующую по убыванию побочную диагональ двумерного...

Рекурсивная быстрая сортировка
Имеется код: procedure QSortRec(var _arr:TArr;min,max:integer); var...

Быстрая сортировка, ошибка
Добрый день! Задали 6 методов сортировок и уже на 5-ой у меня голова кругом( ...

31
magirus
Почетный модератор
Эксперт по компьютерным сетямЭксперт Windows
27955 / 15676 / 959
Регистрация: 15.09.2009
Сообщений: 67,836
Записей в блоге: 78
05.07.2017, 22:20 2
начинай.
0
D1973
Модератор
3550 / 2560 / 1249
Регистрация: 21.01.2014
Сообщений: 10,764
Записей в блоге: 3
Завершенные тесты: 1
06.07.2017, 05:22 3
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
var  Arr: array[0..7] of integer = (1, 5, 4, 2, 6, 3, 7, 8);
...
procedure QuickSort(var A: array of integer; Lo, Hi: integer);
var l, r, p, tmp: integer;
begin
 l := Lo;
 r := Hi;
 p := A[(l + r) div 2];
 repeat
   while A[l] < p do inc(l);
   while A[r] > p do dec(r);
   if l <= r
    then begin
          if A[l] > A[r]
           then begin
                 tmp := A[l]; A[l] := A[r]; A[r] := tmp;
                  end;
          inc(l);
          dec(r);
         end;
 until l >= r;
 if Lo < r then QuickSort(A, Lo, r);
 if l < Hi then QuickSort(A, l, Hi);
end;
 
//Пример вызова
QuickSort(Arr, Low(Arr), High(Arr));
0
Rimean
0 / 0 / 0
Регистрация: 23.11.2016
Сообщений: 27
08.07.2017, 22:46  [ТС] 4
спасибо,с кодом я разобрался уже,но вот как связать массив с кодом сортировки,если мой массив записывает рандомные числа в StringGrid? может быть можно как-то считать из таблицы массив,чтобы потом с ним работать? код такой:

Delphi
1
2
3
4
5
6
7
8
9
10
11
procedure TForm1.btn1Click(Sender: TObject);
begin
  a:=strtoint(Form1.edt1.Text);
  Form1.strngrd1.colcount:=a;
 
  begin
    for i:=0 to a do
    Form1.strngrd1.cells[i,0]:=inttostr(Random(100));
 
  end;
end;
на форме у меня сама таблица (стринггрид), окно для записи числа,определяющего размер массива (edt1) и кнопка для вызова этой процедуры записи..
0
D1973
Модератор
3550 / 2560 / 1249
Регистрация: 21.01.2014
Сообщений: 10,764
Записей в блоге: 3
Завершенные тесты: 1
08.07.2017, 23:11 5
Цитата Сообщение от Rimean Посмотреть сообщение
можно как-то считать из таблицы массив,чтобы потом с ним работать?
Вообще-то все делается с точностью до наоборот: сначала создается массив, заполняется случайными числами, а СтрингГрид используется только для визуализации этого самого массива.

Добавлено через 6 минут
Примерно так:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
procedure TForm1.btn1Click(Sender: TObject);
var i: integer;
     A: array of integer;
begin
 SetLength(A, StrToInt(Edit1.Text));
 strngrd1.colcount := StrToInt(Edit1.Text);
 for i := 0 to High(A) do
  begin
   A[i] := Random(100);    
  strngrd1.cells[i,0] := IntToStr(A[i]);
  end;
end;
0
Rimean
0 / 0 / 0
Регистрация: 23.11.2016
Сообщений: 27
10.07.2017, 10:51  [ТС] 6
теперь понятно,а как сделать так,чтобы можно было реализовать быструю сортировку этого массива по убыванию и возрастанию? вроде бы где-то в самом коде просто нужно менять знак сравнения,или я не так думаю? и как еще можно добавить результат,остортированный массив на поле мемо?
0
krapotkin
3435 / 3039 / 1050
Регистрация: 14.04.2014
Сообщений: 14,746
Записей в блоге: 15
10.07.2017, 10:57 7
если сделать вместо массива список, то ему достаточно указать функцию сравнения двух элементов, и вызывать его метод Sort. Из которого собственно и добыт вышеописанный код.
соответственно, меняя знак этой функции, можно сортировать хоть вверх, хоть вниз
0
Massaraksh7
311 / 264 / 87
Регистрация: 27.05.2017
Сообщений: 1,350
10.07.2017, 11:05 8
Цитата Сообщение от Rimean Посмотреть сообщение
вроде бы где-то в самом коде просто нужно менять знак сравнения
В 14 строке.
0
D1973
Модератор
3550 / 2560 / 1249
Регистрация: 21.01.2014
Сообщений: 10,764
Записей в блоге: 3
Завершенные тесты: 1
10.07.2017, 11:16 9
Цитата Сообщение от Rimean Посмотреть сообщение
как еще можно добавить результат,остортированный массив на поле мемо?
А что ему (результату) на этом "поле" делать? Положите на форму еще одни СтрингГрид, точную копию первого и в него массив выводите...
0
Rimean
0 / 0 / 0
Регистрация: 23.11.2016
Сообщений: 27
10.07.2017, 21:25  [ТС] 10
сделала новую стринггрид, прописала код для записи массива в нее, теперь осталось связать процедуру сортировки с кнопкой,так,как раньше подобное делал, не получется. что делать?
0
Massaraksh7
311 / 264 / 87
Регистрация: 27.05.2017
Сообщений: 1,350
11.07.2017, 04:21 11
Универсальная сортировка массивов структур.
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
58
//-----------------------------------------------------
//       Быстрая сортировка массивов структур
//
//       p   - Указатель на структуру
//       size - Размер структуры
//       imin - Минимальный индекс
//       imax - Максимальный индекс
//       Comp - функция сравнения пользователя, возвращает 1, если первый элемент больше второго больше, -1 меньше, 0 равно
//
// Пример:   type TStr=record
//                     ee:integer;
//                     es:string;
//                     val:Extended;
//                     bv:byte;
//                     iv:integer;
//                     sv:string;
//                     rv:double;
//                     end;
//           var te:array [0..10] of TStr;
//           var p:pByte;
//           ...............................
//  type   CompFunction = function(i1,i2:integer):integer;
//           ...............................
//           function Comp(i1,i2:integer):integer;
//           begin
//           if te[i1].val>te[i2].val then Result:=1
//              else if te[i1].val<te[i2].val then Result:=-1 else Result:=0;
//           end;
//           ...............................
//           p:=@te[0];
//           qSort(p,sizeof(TStr),0,10,Comp);  //---Сортировка по val
//
procedure qSort(p:pByte;size,imin,imax:integer;Comp:CompFunction);
var i,j,m:integer;
pp1,pp2:pByte;
tmp:pByte;
begin
i:=imin;j:=imax;
m:=imax-((imax-imin) div 2);
while i<j do
   begin
   while (Comp(i,m)<0) do inc(i);
   while (Comp(j,m)>0) do dec(j);
   if i<=j then
      begin
      tmp:=GetMemory(size);
      pp1:=p;inc(pp1,i*size);
      pp2:=p;inc(pp2,j*size);
      Move(&pp1[0],&tmp[0],size);
      Move(&pp2[0],&pp1[0],size);
      Move(&tmp[0],&pp2[0],size);
      FreeMemory(tmp);
      inc(i);dec(j);
      end;
   end;
if imin<j then qSort(p,size,imin,j,Comp);
if i<imax then qSort(p,size,i,imax,Comp);
end;
0
Rimean
0 / 0 / 0
Регистрация: 23.11.2016
Сообщений: 27
11.07.2017, 21:40  [ТС] 12
пожалуйста,посмотрите на предмет ошибок, все откомпилировано,но не работает, не выводит результат ,как мне нужно..
0
Вложения
Тип файла: zip Архив ZIP - WinRAR.zip (234.6 Кб, 1 просмотров)
Rimean
0 / 0 / 0
Регистрация: 23.11.2016
Сообщений: 27
11.07.2017, 22:13  [ТС] 13
помогите,пожалуйста,найти ошибки
0
Вложения
Тип файла: zip Архив ZIP - WinRAR.zip (234.6 Кб, 2 просмотров)
unifikator
490 / 348 / 229
Регистрация: 29.03.2015
Сообщений: 675
12.07.2017, 00:46 14
Код:
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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Grids, StdCtrls, ExtCtrls;
 
type
  TForm1 = class(TForm)
    edt1: TEdit;
    lbl1: TLabel;
    btn1: TButton;
    Button1: TButton;
    strngrd1: TStringGrid;
    strngrd2: TStringGrid;
    lbl2: TLabel;
    lbl3: TLabel;
    btn2: TButton;
    procedure btn1Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure btn2Click(Sender: TObject);
 
 
 
 
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
 
 
 
procedure TForm1.btn1Click(Sender: TObject);
var
i:integer;
begin
strngrd1.colcount:=StrToInt(Edt1.Text);
strngrd2.ColCount:=strngrd1.colcount;
randomize;
for i:=0 to strngrd1.colcount-1 do
strngrd1.cells[i,0]:=inttostr(Random(100));
end;
 
 
procedure quicksort(d:boolean);
var
i,j,c:integer;
a:array of integer;
procedure xchg;
begin
c:=a[j];
a[j]:=a[j+1];
a[j+1]:=c;
end;
begin
with form1 do
begin
setlength(a,strngrd1.ColCount);
for i:=0 to strngrd1.ColCount-1 do
a[i]:=strtoint(strngrd1.cells[i,0]);
for i:=0 to strngrd1.ColCount-1 do
for j:=0 to strngrd1.ColCount-2 do
if d then
begin
if a[j]<a[j+1] then
xchg;
end
else
begin
if a[j]>a[j+1] then
xchg;
end;
for i:=0 to length(a)-1 do
strngrd2.cells[i,0]:=inttostr(a[i]);
end;
end;
 
procedure TForm1.Button1Click(Sender: TObject);
begin
QuickSort(false);
end;
 
 
 
procedure TForm1.btn2Click(Sender: TObject);
begin
QuickSort(true);
end;
 
end.
Прилагаю проект на Delphi.
1
Вложения
Тип файла: zip sort.zip (233.5 Кб, 3 просмотров)
D1973
Модератор
3550 / 2560 / 1249
Регистрация: 21.01.2014
Сообщений: 10,764
Записей в блоге: 3
Завершенные тесты: 1
12.07.2017, 06:12 15
Цитата Сообщение от Rimean Посмотреть сообщение
посмотрите на предмет ошибок
Проще переделать было, чем править...
0
Вложения
Тип файла: rar Архив ZIP - WinRAR.rar (1.7 Кб, 7 просмотров)
Rimean
0 / 0 / 0
Регистрация: 23.11.2016
Сообщений: 27
12.07.2017, 10:14  [ТС] 16
спасибо огромное!
0
Rimean
0 / 0 / 0
Регистрация: 23.11.2016
Сообщений: 27
13.07.2017, 14:45  [ТС] 17
а как сделать так,чтобы вся последовательность сортировки отражалась на поле мемо? построчно? можно ли как-то подправить,чтобы так можно было проиллюстрировать?
0
Massaraksh7
311 / 264 / 87
Регистрация: 27.05.2017
Сообщений: 1,350
13.07.2017, 14:54 18
Лучше сделать в графическом виде, нагляднее.
0
Rimean
0 / 0 / 0
Регистрация: 23.11.2016
Сообщений: 27
13.07.2017, 15:06  [ТС] 19
а как сделать так,чтобы вся последовательность сортировки отражалась на поле мемо? построчно? можно ли как-то подправить,чтобы так можно было проиллюстрировать?

Добавлено через 6 минут
по заданию нужно на поле мемо делать :С
0
krapotkin
3435 / 3039 / 1050
Регистрация: 14.04.2014
Сообщений: 14,746
Записей в блоге: 15
13.07.2017, 15:10 20
******************
*************
***********************
******
****
***************
вот так
0
13.07.2017, 15:10
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.07.2017, 15:10

Неправильно работает быстрая сортировка
Нашел на форуме код с сортировкой ( быстрая сортировка ) но он почему то не...

Быстрая сортировка / Delphi XE4
Ребята, здравствуйте. Очень понадобилась ваша помощь. Нужна быстрая...

Курсовая по ООП (Быстрая сортировка)
Ребята здравствуйте, я делаю курсовую и у меня возникла проблема с программой,...


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

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

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