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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
shishkin
0 / 0 / 0
Регистрация: 31.05.2010
Сообщений: 12
#1

Сортировка слиянием - C++

18.05.2012, 23:50. Просмотров 944. Ответов 1
Метки нет (Все метки)

Добрый вечер. C си начал совсем недавно работать, до этого был паскаль, делфи. Есть рабочий код на паскале, прошу помочь разобраться в чем ошибка, в переделанном мною коде под си.
Код Паскаль:
Pascal
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
program SortSlian;
uses crt;
type mas=array[1..1000] of integer;
procedure Sliv(var a:mas;p,q : integer);                
{процедура сливающая массивы, p-начало, q-конец}            
var r,i,j,k : integer;
    b:mas;
begin
 r:=(p+q) div 2;{делим массив}                      
 i:=p;{начало левой половины}                       
 j:=r+1;{начало правой половины}                    
 for k:=p to q do{смотрим от начала до конца}               
 if (i<=r) and ((j>q) or (a[i]<a[j])) then              
 {переставляем элементы из половин в новый массив, упорядочивая пары}
  begin
   b[k]:=a[i];
   i:=i+1;
  end
 else
  begin
   b[k]:=a[j];
   j:=j+1;
  end ;
 for k:=p to q do
 a[k]:=b[k];
end;
{рекурсивная процедура сортировки, проверяет если осталось
больше одного элемента, повторяет слияние в левой или правой частях массива}
procedure Sort(var a:mas;p,q : integer); {p,q - индексы начала и конца сортируемой части массива}
begin
 if p<q then {массив из одного элемента тривиально упорядочен}
 begin
  Sort(a,p,(p+q) div 2);{сортируем левую половину}
  Sort(a,(p+q) div 2 + 1,q);{правую половину}
  Sliv(a,p,q);{сливаем две половины}
 end;
end;
var a:mas;
    n,i:integer;
begin
 clrscr;
 randomize;
 write('Размер массива n=');
 readln(n); {Определение размера массива A - N) и его заполнение}
 writeln('Исходный массив:');
 for i:=1 to n do
  begin
   a[i]:=random(50);
   write(a[i],' ');
  end;
 writeln;
 writeln;
 {запуск сортирующей процедуры, сортируем от первого до последнего элемента}
 Sort(a,1,N);
 {Вывод отсортированного массива A}
 writeln('Результат сортировки:');
 for i:=1 to n do
 write(a[i],' ');
 readln
end.
Код на СИ:
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
// Lab01.cpp : Defines the entry point for the console application.
//
 
#include "stdafx.h"
#include <iostream>
 
 int Sliv(int A[1000], int nach, int kon) 
 {
     int r,i,j,k;
     int B[1000];
     r=(nach+kon)/2;
     i=nach;
     j=r+1;
     for(k=nach;k<=kon;k++)
     if (i<=r) if ((j>kon) || (A[i]<A[j]))
     {
         B[k]=A[i];
         i++;
     }
     else 
     {
         B[k]=A[j];
         j++;
     }
 for (k=nach;i<=kon;i++) 
     A[k]=B[k];
 return 0;
 }
int Sort(int A[1000], int nach, int kon)
{
 if (nach<kon)
{ 
  Sort(A,nach,(nach+kon)/2);
  Sort(A,(nach+kon)/2 + 1,kon);
  Sliv(A,nach,kon);
 }
return 0;
}
int main() {
int kol,i;
int vec[100];
std::cout<< "\n Vvedite kolichestvo elementov: ";
std::cin>>kol;
std::cout<< "\n Vvedite massiv: ";
for(i=0;i<=kol-1;i++)
std::cin>>vec[i];
Sort(vec,0,kol-1);
for(i=0;i<=kol-1;i++)
std::cout<<vec[i];
return 0;
}
Сортировка работает неправильно.

Добавлено через 2 часа 57 минут
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.05.2012, 23:50     Сортировка слиянием
Посмотрите здесь:

Сортировка естественным слиянием - C++
Не могу понять в чем ошибка и как до реализовать саму сортировку если возможно объясните где ошибка и помогите доделать код. Задача...

Сортировка двупутевым слиянием - C++
Помогите исправить функцию сортировки двухпутевого слияния... Функция корректно работает и выдает результат только лишь если она работает...

Сортировка простым слиянием - C++
Нужно считать числа из двух документов, сделать слияние и сортировку и вывести результат в консоли. Искала нечто похожее, не нашла.

Сортировка ест. слиянием - C++
Задача : Отсортировать текстовый файл, содержащий вещественные числа, в порядке убывания методом естественного слияния.

Обменная сортировка со слиянием - C++
Помогите! Нужна рабочая программа для Visual C++ с обменной сортировкой и слиянием. Например 2 массивов.

Сортировка слиянием вылетает - C++
Добрый вечер. Попробовал написать сортировку слиянием, а виндовс прекращает работу программы. Пишу в билдере, он ошибок не выдаёт, всё...

Сортировка естественным слиянием - C++
Нету не у кого на примете решенной задачки? Отсортировать бинарный файл, содержащий целые числа, в порядке убывания методом естественного...

Сортировка слиянием С++ объясните - C++
Помогите, пожалуйте, мне нужно объяснить эту программу примитивным языком, нужно для защиты курсовой работы #include&lt;stdio.h&gt; ...

Сортировка простым слиянием - C++
Написала прогу, а не сортирует( #include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &quot;windows.h&quot; #include &quot;math.h&quot; using namespace...

Не работает сортировка слиянием - C++
#include&lt;stdio.h&gt; #include&lt;iostream&gt; #define zn 7 int*sort(int array, int min, int max); int*sort1(int array, int min, int middle,...


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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
valeriikozlov
Эксперт C++
4669 / 2495 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
19.05.2012, 01:02     Сортировка слиянием #2
Цитата Сообщение от shishkin Посмотреть сообщение
Сортировка работает неправильно.
если хотите именно тот вариант:
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
#include "stdafx.h"
#include <iostream>
#include <algorithm>
 
 int Sliv(int A[1000], int nach, int kon) 
 {
     int r,i,j,k;
     int B[1000];
     r=(nach+kon)/2;
     i=nach;
     j=r;
     for(k=nach;k<=kon;k++)
     if ((i<=r) && ((j>kon) || (A[i]<A[j])))
     {
         B[k]=A[i];
         i++;
     }
     else 
     {
         B[k]=A[j];
         j++;
     }
 for (k=nach;k<=kon;k++) 
     A[k]=B[k];
 return 0;
 }
int Sort(int A[1000], int nach, int kon)
{
 if (nach<kon)
{ 
     std::sort(A, A+(nach+kon)/2);
     std::sort(A+(nach+kon)/2, A+kon+1);
  Sliv(A,nach,kon);
 }
return 0;
}
int main() {
int kol,i;
int vec[100];
std::cout<< "\n Vvedite kolichestvo elementov: ";
std::cin>>kol;
std::cout<< "\n Vvedite massiv: ";
for(i=0;i<=kol-1;i++)
std::cin>>vec[i];
Sort(vec,0,kol-1);
for(i=0;i<=kol-1;i++)
std::cout<<vec[i];
return 0;
}
Yandex
Объявления
19.05.2012, 01:02     Сортировка слиянием
Ответ Создать тему
Опции темы

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