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

Многопутевое слияние. Пропускается элемент с индексом 1 - C++

Восстановить пароль Регистрация
 
aksdaqg
0 / 0 / 0
Регистрация: 31.03.2014
Сообщений: 112
02.04.2014, 11:29     Многопутевое слияние. Пропускается элемент с индексом 1 #1
Собсна вот алгоритм. Проблема в том, что пропускается элемент с индексом 1. В чем проблема. Еще если можно, помогите организовать чтение из файла.
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
124
125
126
127
128
129
130
131
#include "stdafx.h"
#include <iostream>
#include <conio.h>
#include <stdlib.h>
 
using namespace std;
 
#define MAXNUMBER 10
 
int base[MAXNUMBER+1],
   b1[MAXNUMBER+2],
   b2[MAXNUMBER+2],
   b3[MAXNUMBER+2],
   b4[MAXNUMBER+2];
int i=1;
 
int merges( int *dest, int *f1, int c1, int *f2, int c2)
    
//сливает две последовательности в одну
//возвращает число вставленных элементов
{ int i=0;
 int t1=0,t2=0;
 int *tf1,*tf2;
 while(c1>0||c2>0)
 { if(c1>0)t1=1;
   if(c2>0)t2=1;
   tf1=f1;tf2=f2;
   do
   {
   i++;
   if(t1&&t2) { if(*(f1)<*(f2)) *(dest++)=*(f1++);
else *(dest++)=*(f2++);
      }
   else if(t1){ *(dest++)=*(f1++);}
    else if(t2){ *(dest++)=*(f2++);}
   if(tf1!=f1) { tf1=f1;if(*(f1)<*(f1-1)) t1=0;}
   if(tf2!=f2) {tf2=f2;if(*(f2)<*(f2-1)) t2=0; }
   }while(t1||t2);
   c1--;c2--;
 };
 return i;
}
int number_of_serieses()
{ int *master;
 master=base;
 int j=1;
 for(int i=0;i<MAXNUMBER;i++)
  { if(*(master)<*(master-1)) j++;
    master++;
  }
 return j;
}
void split( int * master, int *f1, int *f2, int *f3, int *f4)
//разбивает последовательность по подпоследовательностям
{ int *t1,*t2,*t3,*t4;
 t1=f1;t2=f2;t3=f3;t4=f4;
 f1++;f2++;f3++;f4++;
 int i=1;
 *(f1++)=*(master++);
 int j=1,sn=double(number_of_serieses()+1)/4,n=1;
 sn=sn>0?sn:1;
 *(t1)=0;
 *(t2)=0;
 *(t3)=0;
 *(t4)=0;
 do
 { if(*(master)<*(master-1))
   { switch(j)
     { case 1:*(t1)+=1;n++;break;
case 2:*(t2)+=1;n++;break;
case 3:*(t3)+=1;n++;break;
case 4:*(t4)+=1;n++;break;
     }
     if(n>sn) { j=j<4?j+1:j;n=1; }
   }
   switch(j)
   { case 1: *(f1++)=*(master++);break;
     case 2: *(f2++)=*(master++);break;
     case 3: *(f3++)=*(master++);break;
     case 4: *(f4++)=*(master++);break;
   }
 }
 while (++i<MAXNUMBER);
 *(t1)+= j!=1 ?0:*(t1)+1;
 *(t2)+= j!=2 ?0:*(t2)+1;
 *(t3)+= j!=3 ?0:*(t3)+1;
 *(t4)+= j!=4 ?0:*(t4)+1;
 *(f1)=0;
 *(f2)=0;
 *(f3)=0;
 *(f4)=0;
}
 
void fillmaster()
{ 
    for(int i=0;i<MAXNUMBER;i++)
{   cout << i <<":";
  cin >> base[i];//=random(10000);
}
    
    base[i]=0;
}
void write(int *matrix)
{ for(int i=0;i<MAXNUMBER;i++)
  {
    if (!(i%20)) {cout << "\n----------------------";
  getch();
 };
    cout << "\n[" << i << "]\t"<< *(matrix++);
  }
}
void main()
 
{// clrscr();
fillmaster();
//  write(base);
 getch();
 
 cout<<"\nNumber Series=" << number_of_serieses();
while(number_of_serieses() != 1)
{
 split(base,b1,b2,b3,b4);
 int shift=merges(base,b1+1,*(b1),b2+1,*(b2));
 merges(base+shift,b3+1,*(b3),b4+1,*(b4));
//  cout<<"\nNumber Series=" << number_of_serieses();
//  getch();
}
 write(base);
 getch();
 cout<<"\nThe END - - - - - - - - -\n";
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.04.2014, 11:29     Многопутевое слияние. Пропускается элемент с индексом 1
Посмотрите здесь:

C++ Вставить в вектор новый элемент перед элементом с заданным индексом
C++ Добавить после элемента массива с заданным индексом элемент со значением 100
C++ Пропускается строка кода
Извлечь элемент из массива рандомным индексом C++
Почему то пропускается условие C++
C++ найти максимальный элемент массива x(15) . переставить местами этот максимальный элемент с индексом 4
Пропускается ввод C++
Пропускается cin.getline C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
02.04.2014, 11:47     Многопутевое слияние. Пропускается элемент с индексом 1 #2
Цитата Сообщение от aksdaqg Посмотреть сообщение
Проблема в том, что пропускается элемент с индексом 1. В чем проблема.
Проблема в том, что пропускается элемент с индексом 1.

А если серьёзно, то Вы хотя бы поточнее указывайте в какой части что пропускает. Что подаете на вход, какой видите результат, и какой он должен быть. Какая вообще суть задачи и т.д. и т.п.
aksdaqg
0 / 0 / 0
Регистрация: 31.03.2014
Сообщений: 112
07.04.2014, 11:53  [ТС]     Многопутевое слияние. Пропускается элемент с индексом 1 #3
Суть в том, что нужно отсортировать файл, используя метод многопутевого слияния. у меня считывается с клавы, а надо с файла, допустим есть массив 9 7 6 5 83 6 65 93 24 78 4 . отсортировывает, пропуская второй элемент(начиная с 0), т.е. не 4 5 6 6 7 9, а 4 6 6 7 9.Вот в чем ошибка. Еще нужно считать массив с файла
Yandex
Объявления
07.04.2014, 11:53     Многопутевое слияние. Пропускается элемент с индексом 1
Ответ Создать тему
Опции темы

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