Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
1 / 1 / 0
Регистрация: 19.09.2012
Сообщений: 54
1

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

29.04.2013, 18:49. Просмотров 677. Ответов 13
Метки нет (Все метки)

Пытаюсь реализовать сортировку слиянием.
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;
}

При запуске выскакивает окно, которое можно посмотреть во вложении.
В чем проблема? как исправить?
0
Миниатюры
Пытаюсь реализовать сортировку слиянием (выскакивает ошибка)  
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.04.2013, 18:49
Ответы с готовыми решениями:

Реализовать внешнюю сортировку слиянием для n файлов
Здравствуйте. Помогите пожалуйста с написанием программы. Реализовать внешнюю сортировку слиянием...

Реализовать сортировку слиянием. Ошибка. Исправте
Исправте, пожалуйста.

Как реализовать сортировку списка слиянием?
Здравствуйте! подскажите, как сделать сортировку слиянием списка (в массиве же: можно разделить...

Связанный список списков: Реализовать сортировку слиянием
Всем доброго времени суток. Помогите решить задачу: Дан список списков вещественных чисел ...

13
380 / 351 / 113
Регистрация: 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");
объясните пожалуйста что вы хотите сделать этими двумя строчками? Если вы хотите получить что-то из файла, то увы, это не верно. Вы всего лишь открыли файл для работы.
0
1 / 1 / 0
Регистрация: 19.09.2012
Сообщений: 54
29.04.2013, 20:25  [ТС] 3
yoghurt92, хотела открыть и считать данные с этих фалов, а затем провести сортировку слиянием.
Не подскажете, как правильно сделать?
0
380 / 351 / 113
Регистрация: 17.05.2012
Сообщений: 1,049
29.04.2013, 20:29 4
12345678, ну мне кажется нужно сохранить данные в массив, вы же массив хотите отсортировать?
0
1 / 1 / 0
Регистрация: 19.09.2012
Сообщений: 54
29.04.2013, 21:48  [ТС] 5
yoghurt92, да
0
380 / 351 / 113
Регистрация: 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;
}
1
1 / 1 / 0
Регистрация: 19.09.2012
Сообщений: 54
29.04.2013, 23:12  [ТС] 7
yoghurt92, а почему такие числа выводятся? у меня другие в файлах прописаны...
0
Миниатюры
Пытаюсь реализовать сортировку слиянием (выскакивает ошибка)  
380 / 351 / 113
Регистрация: 17.05.2012
Сообщений: 1,049
29.04.2013, 23:36 8
12345678, в файлах должно быть по 10 чисел, два массива по 10 элементов каждый
0
Форумчанин
Эксперт CЭксперт С++
8157 / 5005 / 1436
Регистрация: 29.11.2010
Сообщений: 13,458
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 минуту
рука так и чешется все переписать под шаблонную функцию с итераторами...
0
1 / 1 / 0
Регистрация: 19.09.2012
Сообщений: 54
30.04.2013, 23:43  [ТС] 10
yoghurt92, проблема не решилась.
0
Миниатюры
Пытаюсь реализовать сортировку слиянием (выскакивает ошибка)  
380 / 351 / 113
Регистрация: 17.05.2012
Сообщений: 1,049
30.04.2013, 23:46 11
12345678, 2 массива по 10 элементов? У меня все прекрасно работает в каждом файле массив из 10 элементов)
0
1 / 1 / 0
Регистрация: 19.09.2012
Сообщений: 54
01.05.2013, 02:42  [ТС] 12
yoghurt92, накосячила немного) Все работает. Но не сортирует. Так и должно быть?
0
380 / 351 / 113
Регистрация: 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;
}
0
Форумчанин
Эксперт CЭксперт С++
8157 / 5005 / 1436
Регистрация: 29.11.2010
Сообщений: 13,458
01.05.2013, 23:13 14
Цитата Сообщение от 12345678 Посмотреть сообщение
Но не сортирует. Так и должно быть?
В файлах числа должны быть неубывающими.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.05.2013, 23:13

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Реализовать восходящую сортировку слиянием без копирования массивов.
Реализовать восходящую сортировку слиянием без копирования массивов. Помогите пожалуйста...

Когда пытаюсь заполнить данными таблицы, везде, выскакивает такая ошибка
Когда пытаюсь заполнить данными таблицы, везде, (во всех таблицах с FK) выскакивает такая ошибка,...

Пытаюсь работать с VkNet на XamarinAndroid visual studio. При добавлении библиотеки выскакивает ошибка
Не удалось установить пакет «Microsoft.NETCore.Jit 1.1.2». Вы пытаетесь установить этот пакет в...

Сортировку вставками меняем на сортировку слиянием
Код программы выполняет сортировку массива вставками. Как сюда вставить код сортировки массива...


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

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

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