Форум программистов, компьютерный форум CyberForum.ru

Сортировка методом каскадного слияния со специальным распределением - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.70
Dobbos
1 / 1 / 0
Регистрация: 01.03.2012
Сообщений: 16
03.07.2012, 00:37     Сортировка методом каскадного слияния со специальным распределением #1
Задание - реализовать этот алгоритм для однмоерного динамического массива. попытки почитать Кнута успехом не увенчались - не понятно. Буду рад любой помощи, будь то ссылка на понятную литературу, или готовый алгоритм( ). Смог найти алгоритм на делфи, но не смог реализовать его на с++, из-за абсолютного незнания делфи.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alexey31415
03.07.2012, 00:46
  #2

Не по теме:

выложите код на делфи,кто-нибудь да поможет его перевести на С++

Dobbos
1 / 1 / 0
Регистрация: 01.03.2012
Сообщений: 16
03.07.2012, 00:48  [ТС]     Сортировка методом каскадного слияния со специальным распределением #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
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
101
102
103
104
105
106
107
108
109
110
111
112
113
var
  Form1: TForm1; p,q,s,d:integer;
  const n =10000000;
  var
 A:array[1..n]of integer;
 L:array[1..n]of integer;
 W:integer;
 Raz:integer;
 d1, d2, d3, d4:TDateTime;
implementation
{$R *.dfm}
  Procedure Sort(p,q : integer); {p,q — индексы начала и конца сортируемой части массива}
Var i,j,r,T : integer;
Begin
 if p<q then {массив из одного элемента тривиально упорядочен}
 begin
  r:=A[p];
  i:=p-1;
  j:=q+1;
  while i<j do
   begin
    repeat
     i:=i+1;
    until A[i]>=r;
    repeat
     j:=j-1;
    until A[j]<=r;
    if i<j then
     begin
      T:=A[i];
      A[i]:=A[j];
      A[j]:=T;
     end;
   end;
  Sort(p,j);
  Sort(j+1,q);
 end;
End;
procedure TForm1.Button1Click(Sender: TObject);  //заполнение
  var
  B:array[1..n] of integer;
 k,j:integer;
 begin    begin
W:=StrToInt(Edit1.Text);
Raz:=StrToInt(Edit4.Text);
StringGrid1.ColCount:=W;
StringGrid2.ColCount:=W;
StringGrid3.ColCount:=W;
end;
for j:=1 to w do begin
  A[j]:=Random(Raz);
  L[j]:=A[j];
   StringGrid1.Cells[j-1,0]:=IntToStr(a[j]); Randomize;
   end;
end;
procedure TForm1.Button2Click(Sender: TObject);
var k,m:integer;
h,min,s,ms:word;
B:array[1..n] of integer;
begin
 Label7.Caption:=Floattostr(time);
 h:=0;min:=0;s:=0;ms:=0;
d1:=Now;
 for k:=1 to w do begin
   Sort(p,k);
  Sort(k+1,q); end;
  for m:=1 to w do begin
   StringGrid2.Cells[m-1,0]:=IntToStr(a[m]); end;
   Decodetime(Time-Strtofloat(label7.caption),h,min,s,ms);
     label7.Caption:=inttostr(s)+' ' +'сек' + ' '+ Inttostr(ms)+ ' '+'мсек';
 end;
  Procedure Sort1(p,q : integer); {p,q — индексы начала и конца сортируемой части массива}
Var i,j,r,T : integer;
Begin
 if p<q then {массив из одного элемента тривиально упорядочен}
 begin
  r:=L[p];
  i:=p-1;
  j:=q+1;
  while i<j do
   begin
    repeat
     i:=i+1;
    until L[i]<=r;
    repeat
     j:=j-1;
    until L[j]>=r;
    if i<j then
     begin
      T:=l[i];
      L[i]:=L[j];
      L[j]:=T;
     end;
   end;
  Sort1(p,j);
  Sort1(j+1,q);
 end;
End;
procedure TForm1.Button3Click(Sender: TObject);
var k,m:integer;
hi,mini,si,msi:word;
B:array[1..n] of integer;
begin
 Label8.Caption:=Floattostr(time);
 hi:=0;mini:=0;si:=0;msi:=0;
 for k:=1 to w do begin
   Sort1(p,k);
  Sort1(k+1,q); end;
  for m:=1 to w do begin
   StringGrid3.Cells[m-1,0]:=IntToStr(l[m]);end;
    Decodetime(Time-Strtofloat(label8.caption),hi,mini,si,msi);
     label8.Caption:= inttostr(si)+' ' +'сек' + ' '+ Inttostr(msi)+ ' '+'мсек';
 end;
ПО утверждениям автора тут кроме сортировки есть еще таймеры процедур. Но вот, что сомг нарыть.
Dobbos
1 / 1 / 0
Регистрация: 01.03.2012
Сообщений: 16
05.07.2012, 01:18  [ТС]     Сортировка методом каскадного слияния со специальным распределением #4
Попытался адаптировать перфую функцию, компилится нрмально, но вот сама прога не работает, не могу найти косяк.
C++
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
#include <conio.h>
#include <stdio.h>
#include <iostream>
#include <clocale>
 
using namespace std;
 
void sort( int p, int q, int A[])
{
    int i,j,r,T;
    if (p<q) 
    {
        r=A[p];
        i=p-1;
        j=q+1;
        while (i<j)
        {
            do {i+=1;} while (A[i]<r);
            do {j-=1;} while (A[i]>r);
            if (i<j)
            {
                T=A[i];
                A[i]=A[j];
                A[j]=T;
            }
        }
    };
    sort(p,j, A);
    sort(j+1,q, A);
}
 
 
void main()
{
    setlocale (LC_CTYPE, "rus");
    int A[9];
    for (int o=0; o<=10; o++)
    {
        printf("введите A[%d]:", o);
        scanf("%d", &A[o]); 
    }
    sort(0, 9, A);
    for (int o=0; o<=10; o++)
    {
        printf("a[%d]= \n", A[o]);
    }
     _getch();
}
Dobbos
1 / 1 / 0
Регистрация: 01.03.2012
Сообщений: 16
06.07.2012, 20:31  [ТС]     Сортировка методом каскадного слияния со специальным распределением #5
Немного исправил ошибки, но все равно не работает.
C++
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
#include <conio.h>
#include <stdio.h>
#include <iostream>
#include <clocale>
 
using namespace std;
 
void sort( int *A, int N, int p, int q)
{
    int i,j,r,T,h;
    if (p<q) 
    {
        printf("\nФУНКЦИЯ НАЧАЛАСЬ");
        r=*(A+p);
        i=p-1;
        j=q+1;
        printf("\nФУНКЦИЯ НАЧАЛАСЬ2");
        while (i<j)
        {
            do {i=i+1;} while (A[i]<r);
            do {j=j-1;} while (A[i]<r);
            if (i<j)
            {
                printf("\nФУНКЦИЯ НАЧАЛАСЬ3");
                T=A[i];
                A[i]=A[j];
                A[j]=T;
            }
        }
    }
    printf("\nФУНКЦИЯ НАЧАЛАСЬ4");
    sort(A, N, *(A+p), j);
    sort(A, N, *(A+j+1), q);
}
 
 
void main()
{
    setlocale (LC_CTYPE, "rus");
    int B[5];
    for (int o=0; o<=5; o++)
    {
        printf("введите B[%d]:", o);
        scanf("%d", &B[o]); 
    }
    int N;
    N=sizeof(B)/sizeof(B[0]);
    sort(B, N, 0, 5);
    for (int o=0; o<=5; o++)
    {
        printf("a[%d]= %d\n", o, B[o]);
    }
     _getch();
}
Yandex
Объявления
06.07.2012, 20:31     Сортировка методом каскадного слияния со специальным распределением
Ответ Создать тему
Опции темы

Текущее время: 14:29. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru