Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.65/26: Рейтинг темы: голосов - 26, средняя оценка - 4.65
0 / 0 / 0
Регистрация: 25.04.2012
Сообщений: 3
1

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

25.04.2012, 13:07. Показов 4811. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Необходимо слить 2 упорядоченных по не возрастанию списка в один, так же упорядоченный по не возрастанию , построив новый список. с++

Написала, но сортировка слиянием в основной программе, сама понимаю что, написана не правильно, но к сожалению не получается разобраться самой. Помогите, пожалуйста, очень нужно=( Буду очень благодарна..

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
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
#pragma argsused
#include <iostream.h>
#include <math.h>
struct node {
 int body;
 
 node* next;};
 
struct list {
 node* head;
 node* tail;
 list();
 void Add(int l);
 void Print();
 void Sort();};
 
 
list::list(){
        head=NULL;}
 
void list::Add(int l){
        node* c=new node;
        c->next=NULL;
        if (head==NULL)
          head=c;
        else
          tail->next=c;
        c->body=l;
        tail=c;}
 
void list::Print(){
        node* t=head;
        while (t!=NULL){
                cout << t->body << " ";
                t=t->next;}
        }
 
void main()
{list spisok1,spisok2,spisok3;int n1=0, n2=0;
cout <<"vvedite kolichestvo el-ov i 1ii spisok, yporiadochenni po nevozrastaniy";
int p;
cin >> p;
for (int i=1; i<=p; i++){
  cout << i << ": ";
  int l;
  cin >> l;
  spisok1.Add(l);
  n1++;}
 
 
 cout <<"vvedite kolichestvo el-ov i 2oi spisok, yporiadochenni po nevozrastaniy";
 cin >> p;
for (int i=1; i<=p; i++){
  cout << i << ": ";
    int l;
  cin >> l;
  spisok2.Add(l);
  n2++;}
 
 
cout << "\n1 spisok   ";
spisok1.Print();
 
cout <<"\n2 spisok   ";
spisok2.Print();
 
 
int i=0, j=0;
  while( i+j < n1+n2 )
    {
        if( (j>=n2) || ( (i<n1) && (spisok1->body>=spisok2->body) ) )
        {
            spisok3->body = spisok1->body;
            spisok1=spisok1->next;
              spisok3=spisok3->next;
 
            i++;
        } else {
            spisok3->body=spisok2->body;
            spisok2=spisok2->next;
              spisok3=spisok3->next;
 
            j++;
        }
    }
 
 cout <<"\n3 spisok   ";
spisok3.Print();
 
 
cin >> p;
 
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.04.2012, 13:07
Ответы с готовыми решениями:

Сортировка слиянием. В каком куске кода происходит сортировка и каким именно образом?
Помогите, пожалуйста, разобраться. Подскажите в каком куске кода происходит сортировка и каким...

Сортировка Слиянием vs Быстрая Сортировка - что лучше
Народ, помогите разобраться какой из методов сортировки лучше &quot;Сортировка Слиянием&quot; или &quot;Быстрая...

2 сортировки: пирамидальная сортировка и сортировка слиянием
Реализовать два улучшенных алгоритма сортировки. Для каждого алгоритма вычислить показатель...

Шейкерная сортировка + сортировка слиянием
вот часть когда,которая выполняет шейкерную сортировку : для символьного и целочисленого массива ....

4
4064 / 3318 / 924
Регистрация: 25.03.2012
Сообщений: 12,495
Записей в блоге: 1
25.04.2012, 17:21 2
у тебя программа не работает.
и зачем в ней у тебя 3 списка?

Добавлено через 1 час 20 минут
Вот посмотри это.
Сортировка не совсем работает, надо отладить.
Но принцип сортировки, думаю ты поймёшь.
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
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
114
115
116
117
118
119
120
121
122
123
#pragma argsused
#include <iostream>
#include <math.h>
using namespace std;
struct node {
 int body;
 node* next;
};
 
struct list {
 node* head;
 node* tail;
 list();
 void Add(int l);
 void AddFront(int l);
 void Print();
 void Sort();
};
 
 
list::list(){
head=NULL;
tail=NULL;
}
 
void list::Add(int l){
        node* c=new node;
        c->body=l;
        if (!head) head=c;
        else       tail->next=c;
        tail=c;
        c->next=NULL;
        
}
 
void list::AddFront(int l){
        node* c=new node;
        c->body=l;
        if (!tail) tail=c;
        c->next=head;
        head=c;
        
}
node* merge( node* lp1,  node* lp2){
     node* begin=NULL;
     node* end=NULL;
     node* insertion;
     while(lp1&&lp2){
         if(lp1->body>lp2->body){
             insertion=lp1;
             lp1=lp1->next;
         }else{
             insertion=lp2;
             lp2=lp2->next;
         }
         if(!end){
             begin=end=insertion;
         }else{
             end->next=insertion;
             end=end->next;
         }
     }
     insertion=(lp1)?lp1:lp2;
      if(!end){
             begin=end=insertion;
         }else{
             end->next=insertion;
             end=end->next;
         }
      end->next=NULL;
      return begin;
 
}
node* MergeSort(node* start){
    if (!start) return NULL;
    node* med;
    node* temp;
    med=temp=start;
    while(temp){
        temp=(!temp->next)?NULL:temp->next->next;
        if(temp)med=med->next;
    }
    if(med){
        temp=med->next;
        med->next=NULL;
        start=MergeSort(start);
        temp=MergeSort(temp);
        return merge(start, temp);
    }
    else return start;
}
void list::Sort(){
    head=MergeSort(head);
} 
void list::Print(){
        node* t=head;
        while (t){
                cout << t->body << " ";
                t=t->next;
        }
 }
void main()
{
    list spisok1;
    int n1=0, n2=0;
    cout <<"vvedite kolichestvo el-ov i 1ii spisok, yporiadochenni po nevozrastaniy";
    int p;
    cin >> p;
    for (int i=1; i<=p; i++){
        cout << i << ": ";
        int l;
        cin >> l;
        spisok1.AddFront(l);
        n1++;
    }
    cout <<"Ishodny Spisok"<<endl;
    spisok1.Print();
    spisok1.Sort();
    cout <<endl<<"sortirovanny Spisok"<<endl;
    spisok1.Print();
    cin >> p;
    
}
1
0 / 0 / 0
Регистрация: 25.04.2012
Сообщений: 3
25.04.2012, 22:51  [ТС] 3
я не совсем поняла почему вам не понравилось наличие у меня 3х списков.По условию 2 уже отсортированных вводятся, а в третий я пыталась слить их так, что бы получился список, отсортированный тоже по не возрастанию
0
4064 / 3318 / 924
Регистрация: 25.03.2012
Сообщений: 12,495
Записей в блоге: 1
25.04.2012, 22:58 4
Цитата Сообщение от vikki777 Посмотреть сообщение
я не совсем поняла почему вам не понравилось наличие у меня 3х списков.По условию 2 уже отсортированных вводятся, а в третий я пыталась слить их так, что бы получился список, отсортированный тоже по не возрастанию
как по-твоему работает сортировка слиянием? У меня подозрение, что ты не понимаешь.
0
Форумчанин
Эксперт CЭксперт С++
8215 / 5045 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
26.04.2012, 02:27 5
http://www.cplusplus.com/reference/stl/list/sort/
0
26.04.2012, 02:27
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.04.2012, 02:27
Помогаю со студенческими работами здесь

Сортировка с слиянием
Добрый вечер! Помогите с подсчетом перестановок и сравнений при сортировке с слиянием. Вот нашел...

сортировка слиянием
Доброго времени суток, помогите пожалуйста с сортировкой слиянием... дело в том что нужно сделать...

Сортировка слиянием
Нужно сделать счётчик который будет считать количество приравниваний в программе. Я что-то никак не...

Сортировка слиянием
Привет всем, пытаюсь сделать сортировку 100 чисел слиянием. Выдается ошибка на функции delete...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru