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

Пытаюсь реализовать сортировку слиянием (выскакивает ошибка) - C++

Восстановить пароль Регистрация
 
12345678
1 / 1 / 0
Регистрация: 19.09.2012
Сообщений: 54
29.04.2013, 18:49     Пытаюсь реализовать сортировку слиянием (выскакивает ошибка) #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
#include "stdafx.h"
#include <iostream>
#include "windows.h"
#include "math.h"
 
// m - size of A
 
// n - size of B
 
// size of C array must be equal or greater than
 
// m + n
 
void merge(int m, int n, int A[], int B[], int C[]) {
 
      int i, j, k;
 
      i = 0;
 
      j = 0;
 
      k = 0;
 
      while (i < m && j < n) {
 
            if (A[i] <= B[j]) {
 
                  C[k] = A[i];
 
                  i++;
 
            } else {
 
                  C[k] = B[j];
 
                  j++;
 
            }
 
            k++;
 
      }
 
      if (i < m) {
 
            for (int p = i; p < m; p++) {
 
                  C[k] = A[p];
 
                  k++;
 
            }
 
      } else {
 
            for (int p = j; p < n; p++) {
 
                  C[k] = B[p];
 
                  k++;
 
            }
 
      }
 
}
 
void print_c(int *c, int k)
{int n; 
    for (n=0;n<k;n++)
    printf("%d " , c[n]);
    printf ("\n");}
 
int _tmain(int argc, _TCHAR* argv[])
{
    int k;
    int *c;//массив
    setlocale(LC_ALL,"Russian");
    FILE *f;
    int err=fopen_s(&f,"H:\\f2.txt","r");
    int erro=fopen_s(&f,"H:\\f3.txt","r");
    if(err)
    {
        printf("Такого файла не существует!");
        return 0;
    }
    if(fscanf_s(f,"%d",&k)!=1)
    {
        printf("Неправильный формат файла");
        return 0;
    }
 
    c=(int *)malloc(sizeof(int)*k);
 
    void merge(int m, int n, int A[], int B[], int C[]);
        print_c(c,k);
 
    return 0;
}

При запуске выскакивает окно, которое можно посмотреть во вложении.
В чем проблема? как исправить?
Миниатюры
Пытаюсь реализовать сортировку слиянием (выскакивает ошибка)  
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.04.2013, 18:49     Пытаюсь реализовать сортировку слиянием (выскакивает ошибка)
Посмотрите здесь:

C++ Реализовать внешнюю сортировку слиянием для n файлов
C++ Как реализовать такую сортировку??
C++ Пытаюсь вывести латинские буквы но не могу реализовать затею
C++ Создать шаблон функции, выполняющая внешнюю сортировку сбалансированным слиянием.
Реализовать сортировку по возрастанию и убыванию C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
yoghurt92
373 / 344 / 22
Регистрация: 17.05.2012
Сообщений: 1,049
29.04.2013, 20:07     Пытаюсь реализовать сортировку слиянием (выскакивает ошибка) #2
Цитата Сообщение от 12345678 Посмотреть сообщение
int err=fopen_s(&f,"H:\\f2.txt","r");
* * int erro=fopen_s(&f,"H:\\f3.txt","r");
объясните пожалуйста что вы хотите сделать этими двумя строчками? Если вы хотите получить что-то из файла, то увы, это не верно. Вы всего лишь открыли файл для работы.
12345678
1 / 1 / 0
Регистрация: 19.09.2012
Сообщений: 54
29.04.2013, 20:25  [ТС]     Пытаюсь реализовать сортировку слиянием (выскакивает ошибка) #3
yoghurt92, хотела открыть и считать данные с этих фалов, а затем провести сортировку слиянием.
Не подскажете, как правильно сделать?
yoghurt92
373 / 344 / 22
Регистрация: 17.05.2012
Сообщений: 1,049
29.04.2013, 20:29     Пытаюсь реализовать сортировку слиянием (выскакивает ошибка) #4
12345678, ну мне кажется нужно сохранить данные в массив, вы же массив хотите отсортировать?
12345678
1 / 1 / 0
Регистрация: 19.09.2012
Сообщений: 54
29.04.2013, 21:48  [ТС]     Пытаюсь реализовать сортировку слиянием (выскакивает ошибка) #5
yoghurt92, да
yoghurt92
373 / 344 / 22
Регистрация: 17.05.2012
Сообщений: 1,049
29.04.2013, 22:09     Пытаюсь реализовать сортировку слиянием (выскакивает ошибка) #6
12345678, вот вам мой вариант, плюсовый

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
#include <iostream>
#include <fstream>
using namespace std;
 
int const size(10);
 
void merge(int a[], int b[], int c[])
{
    int kol1(0), kol2(0);
    for(int i = 0; i < 2*size; i++)
    {
        if(kol1 == size)
        {
            c[i] = b[kol2];
            kol2++;
            continue;
        }
        if(kol2 == size)
        {
            c[i] = a[kol1];
            kol1++;
            continue;
        }
 
        if(a[kol1]<=b[kol2])
        {
            c[i] = a[kol1];
            kol1++;
        }
        else
        {
            c[i] = b[kol2];
            kol2++;
        }
    }
}
 
int _tmain(int argc, _TCHAR* argv[])
{
    ifstream fin("input.txt", ios::in);
    ifstream fin2("input2.txt", ios::in);
 
    int mas[size], mas2[size], mas3[2*size];
 
    for(int i = 0; i < size; ++i){
        fin >> mas[i];
        fin2 >> mas2[i];
    }
 
    merge(mas, mas2, mas3);
 
    for(int i = 0; i < 2*size; ++i)
        cout << mas3[i] << ' ';
 
    fin.close();
    fin2.close();
    cout << "\n\n";
    return 0;
}
12345678
1 / 1 / 0
Регистрация: 19.09.2012
Сообщений: 54
29.04.2013, 23:12  [ТС]     Пытаюсь реализовать сортировку слиянием (выскакивает ошибка) #7
yoghurt92, а почему такие числа выводятся? у меня другие в файлах прописаны...
Миниатюры
Пытаюсь реализовать сортировку слиянием (выскакивает ошибка)  
yoghurt92
373 / 344 / 22
Регистрация: 17.05.2012
Сообщений: 1,049
29.04.2013, 23:36     Пытаюсь реализовать сортировку слиянием (выскакивает ошибка) #8
12345678, в файлах должно быть по 10 чисел, два массива по 10 элементов каждый
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4927 / 2670 / 243
Регистрация: 29.11.2010
Сообщений: 7,429
30.04.2013, 01:29     Пытаюсь реализовать сортировку слиянием (выскакивает ошибка) #9
Тот же алгоритм, но для любого кол-ва чисел и с проверкой на открытие файла
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
#include <iostream>
#include <fstream>
#include <vector>
 
void merge(const std::vector<int> &a, const std::vector<int> &b, std::vector<int> &c)
{
    std::vector<int>::const_iterator it1 = a.begin(), it2 = b.begin();
    while (it1 != a.end() && it2 != b.end())
    {
        if(it1 == a.end())
        {
            c.push_back(*it2++);
            continue;
        }
        if(it2 == b.end())
        {
            c.push_back(*it1++);
            continue;
        }
 
        if(*it1 < *it2)
            c.push_back(*it1++);
        else
            c.push_back(*it2++);
    }
}
 
int main()
{
    std::ifstream ifs1("input.txt"), ifs2("input2.txt");
    std::vector<int> a, b, c;
    int tmp;
 
    if (!ifs1 || !ifs2) return 1;
    while (!ifs1.eof() && ifs1 >> tmp)
        a.push_back(tmp);
    while (!ifs2.eof() && ifs2 >> tmp)
        b.push_back(tmp);
    merge(a, b, c);
    for (std::vector<int>::const_iterator it = c.begin(); it != c.end(); ++it)
        std::cout << *it << " ";
}
Добавлено через 1 минуту
рука так и чешется все переписать под шаблонную функцию с итераторами...
12345678
1 / 1 / 0
Регистрация: 19.09.2012
Сообщений: 54
30.04.2013, 23:43  [ТС]     Пытаюсь реализовать сортировку слиянием (выскакивает ошибка) #10
yoghurt92, проблема не решилась.
Миниатюры
Пытаюсь реализовать сортировку слиянием (выскакивает ошибка)  
yoghurt92
373 / 344 / 22
Регистрация: 17.05.2012
Сообщений: 1,049
30.04.2013, 23:46     Пытаюсь реализовать сортировку слиянием (выскакивает ошибка) #11
12345678, 2 массива по 10 элементов? У меня все прекрасно работает в каждом файле массив из 10 элементов)
12345678
1 / 1 / 0
Регистрация: 19.09.2012
Сообщений: 54
01.05.2013, 02:42  [ТС]     Пытаюсь реализовать сортировку слиянием (выскакивает ошибка) #12
yoghurt92, накосячила немного) Все работает. Но не сортирует. Так и должно быть?
yoghurt92
373 / 344 / 22
Регистрация: 17.05.2012
Сообщений: 1,049
01.05.2013, 09:58     Пытаюсь реализовать сортировку слиянием (выскакивает ошибка) #13
12345678, вот еще вариант, хотя все правильно сортирует

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 <iostream>
#include <fstream>
using namespace std;
 
int const size(10);
 
void Merge(int A[], int B[], int C[])
{ //Выполнить слияние массива A, содержащего nA элементов,
  //  и массива B, содержащего nB элементов.
  //  Результат записать в массив C.
 
    int a(0), b(0); //Номера текущих элементов в массивах A и B
 
    while( a+b < size+size ) //Пока остались элементы в массивах
    {
        if( (b>=size) || ( (a<size) && (A[a]<=B[b]) ) )
        { //Копирую элемент из массива A
            C[a+b] = A[a];
            ++a;
        } else { //Копирую элемент из массива B
            C[a+b] = B[b];
            ++b;
        }
    }
}
 
int _tmain(int argc, _TCHAR* argv[])
{
    ifstream fin("input.txt", ios::in);
    ifstream fin2("input2.txt", ios::in);
 
    int mas[size], mas2[size], mas3[2*size];
 
    for(int i = 0; i < size; ++i){
        fin >> mas[i];
        fin2 >> mas2[i];
    }
 
    Merge(mas, mas2, mas3);
 
    for(int i = 0; i < 2*size; ++i)
        cout << mas3[i] << ' ';
 
    fin.close();
    fin2.close();
    cout << "\n\n";
    return 0;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.05.2013, 23:13     Пытаюсь реализовать сортировку слиянием (выскакивает ошибка)
Еще ссылки по теме:

Осуществить сортировку текстового файла по длине строк циклическим слиянием/разделением C++
Сортировку вставками меняем на сортировку слиянием C++
Сортировку вставками меняем на Пирамидальную сортировку и на Сортировку подсчётом C++

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

Или воспользуйтесь поиском по форуму:
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4927 / 2670 / 243
Регистрация: 29.11.2010
Сообщений: 7,429
01.05.2013, 23:13     Пытаюсь реализовать сортировку слиянием (выскакивает ошибка) #14
Цитата Сообщение от 12345678 Посмотреть сообщение
Но не сортирует. Так и должно быть?
В файлах числа должны быть неубывающими.
Yandex
Объявления
01.05.2013, 23:13     Пытаюсь реализовать сортировку слиянием (выскакивает ошибка)
Ответ Создать тему
Опции темы

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