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

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

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

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

02.04.2014, 11:29. Просмотров 477. Ответов 2
Метки нет (Все метки)

Собсна вот алгоритм. Проблема в том, что пропускается элемент с индексом 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";
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.04.2014, 11:29
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Многопутевое слияние. Пропускается элемент с индексом 1 (C++):

найти максимальный элемент массива x(15) . переставить местами этот максимальный элемент с индексом 4 - C++
поможете с курсовым ?

Извлечь элемент из массива рандомным индексом - C++
Привет. Есть массив, задача в том, чтобы извлечь из массива элемент рандомным индексом, но чтобы позже не допустить получение этого же...

Из заданного массива удалить элемент с указанным индексом - C++
Здравствуйте!Условие задачи таково: 1) Сформировать одномерный массив целых чисел, используя датчик случайных чисел. 2) Распечатать...

Замените минимальный элемент массива его удвоенным индексом - C++
Замените минимальный элемент массива А его удвоенным индексом. C++ Попробовал НЕ ПОЛУЧИЛОСЬ((( Добавлено через 1 минуту ...

Вставить в вектор новый элемент перед элементом с заданным индексом - C++
Здравствуйте. У меня следующая проблема: Мне в программе нужно в вектор вставить в определенное место элемент. Лучше всего мне походит...

Если элемент массива с четным индексом меньше предыдущего - поменять их местами - C++
C++ Программно случайным образом сформировать одномерный целочисленный массив. 1) Вывести массив на экран 2) Сравнить первый и...

2
Tulosba
:)
Эксперт С++
4396 / 3232 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
02.04.2014, 11:47 #2
Цитата Сообщение от aksdaqg Посмотреть сообщение
Проблема в том, что пропускается элемент с индексом 1. В чем проблема.
Проблема в том, что пропускается элемент с индексом 1.

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

Добавить после элемента массива с заданным индексом элемент со значением 100 - C++
Удалить последний элемент равный 0. Добавить после элемента массива с заданным индексом элемент со значением 100. Добавлено через 15...

Убрать те строки матрицы, в которых ни один элемент не является взаимно простым со своим индексом - C++
Задача: Дан динамический массив. Убрать те строки матрицы, в которых ни один элемент не взаимно прост со своим индексом. Заранее...

Заменить каждый неположительный элемент массива Х абсолютной величиной элемента массива Y с тем же индексом - C++
Добрый день. Нужно решить задачку: Заменить каждый неположительный элемент массива Х абсолютной величиной имеющего тот же номер элемента...

В данном линейном целочисленном массиве каждый элемент с четным индексом увеличить на значение индекса, с нечетным — уменьшить на значение индекса - C++
В данном линейном целочисленном массиве каждый элемент с четным индексом увеличить на значение индекса, с нечетным — уменьшить на значение...


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

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

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