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

Сортировка 2-х массивов во время их слияния

16.12.2014, 09:52. Показов 488. Ответов 1
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Задача: записать 2 массива чисел, и отсортировать на выбор - слиянием или вставкой

Сделал сортировку отдельно каждого массива, а потом сортирую при слияние (ф-я combine). Надо сделать что бы изначально 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
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
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
#include "stdafx.h"
#include <locale.h>
#include <iostream>
 
void read(long long *, int *);
int merge(long long *, int, int, int, int *);
int mergesort(long long *, int, int, int*);
int combine(long long *, long long *, int, int);
void write(long long *, int);
void swap(long long *, long long *);
int sort(long long *, int, int *);
 
 
 
int main()
{
    long long arr1[30], arr2[30];
    char x;
    int  n1, n2, k1 = 0, k2 = 0;
    int perev1 = 0, perev2 = 0;
    setlocale(LC_ALL, "Russian");
    printf("Сортировка вставками(1) чи слиянием(2)");
    x = getchar();
    read(arr1, &n1);            
    read(arr2, &n2);                    
    switch (x)
    {
    case'1':
        perev1 += sort(arr1, n1, &k1);                              
        perev1 += sort(arr2, n2, &k1); break;                           
    case '2':
        perev2 = mergesort(arr1, 0, n1 - 1, &k2);
        perev2 += mergesort(arr2, 0, n2 - 1, &k2);
    }
    n1 = combine(arr1, arr2, n1, n2);               
    switch (x)
    {
    case '1':printf("Вставками: Обменов - %d, проверок - %d\n", k1, perev1); break;
 
    case'2':printf("Слиянием: Обменов - %d, проверок - %d\n", k2, perev2);
    }
    write(arr1, n1);                                
    system("pause");
    return 0;
}
 
 
 
void read(long long *arr, int *n)
{
    int  i;
    long long x;
    puts("Элементы массива, конец - буква:");
    i = 0;
    while (scanf_s("%lld", &x) == 1 && i<30)
        arr[i++] = x;
    fflush(stdin);
    *n = i;
}
 
 
int combine(long long *arr1, long long *arr2, int n1, int n2)
{
    int i, j;
    for (i = 0; i < n2; i++)
    {
        j = n1 - 1;
        while (arr1[j] > arr2[i] && j>-1)
            arr1[j + 1] = arr1[j--];
        arr1[j + 1] = arr2[i];
        n1++;
    }
    return n1;
}
 
 
 
void write(long long *arr, int n)
{
    puts("Обьедененный массив");
    for (int i = 0; i < n; i++)
        printf("%lld ", arr[i]);
    puts("");
}
 
 
int sort(long long *arr, int n, int *kilk)      
{
    int com = 1;
    if (n < 2) return com;
    for (int i = 1; i < n; i++, com++)
    for (int j = i; j && arr[j] < arr[j - 1]; j--, com += 2)
    {
        swap(&arr[j], &arr[j - 1]);
        (*kilk) += 3;
    }
    return com;         
}
 
void swap(long long *a, long long *b)
{
    long long c;
    c = *a;
    *a = *b;
    *b = c;
}
 
int mergesort(long long *a, int low, int high, int *k1)     
{
    int mid;
    int  p = 0;
    if (low < high)
    {
        mid = (low + high) / 2;
        p += mergesort(a, low, mid, k1);
        p += mergesort(a, mid + 1, high, k1);
        *k1 += merge(a, low, high, mid, &p);
    }
    p++;
    return p;
}
 
 
int merge(long long *a, int low, int high, int mid, int *p)
{
    int i, j, k, k1;
    long long c[50];
    i = low;
    k = low;
    j = mid + 1;
    while (i <= mid && j <= high)
    if (a[i] < a[j])
        c[k++] = a[i++];
    else
        c[k++] = a[j++];
    k1 = k;     
    *p += (k - low + 1) * 3 - 1;
    while (i <= mid)
        c[k++] = a[i++];
    *p += k - k1 + 1;
    k1 = k;
    while (j <= high)
        c[k++] = a[j++];
    *p += k - k1 + 1;
    for (i = low; i < k; i++)
        a[i] = c[i];
    *p = *p + k - low + 1;
    return k * 2;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.12.2014, 09:52
Ответы с готовыми решениями:

Сортировка 2 массивов по возрастанию и используя метод слияния запись в другой массив
пожалуйста очень очень необходима задача ,если можно до завтрашних 9.00 Суть задачи 2...

Метод слияния двух массивов
Нужно разработать метод слияния двух массивов в третий (сортировка не важна) Как я вижу...

Сформировать массив L из массивов A и B путем их слияния
1. Задан массив A из N элементов и массив B из M элементов. Сформировать массив L из массивов A и B...

Слияния двух массивов в отсортированный по возрастанию массив
Даны 2 массива. Массив А состоит из N элементов и отсортирован по возрастанию. Массив В состоит из...

1
0 / 0 / 0
Регистрация: 14.05.2014
Сообщений: 29
23.12.2014, 23:32  [ТС] 2
Может кто просто подсказать как это лучше сделать?
0
23.12.2014, 23:32
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.12.2014, 23:32
Помогаю со студенческими работами здесь

Графическая иллюстрация сортировки массивов алгоритмом слияния
Напишите программу для графической иллюстрации сортировки массивов алгоритмом слияния. Массивы...

Получить из 2 массивов путем слияния упорядоченный по возрастанию массив С
Даны два упорядоченных по возрастанию массива A(m) и B(n). Получить из них путем слияния...

Из двух упорядоченных массивов получить путем слияния упорядоченный массив C
ЗАДАЧА. Из двух упорядоченных массивов по не возрастанию массивов A(m) и B(n) получить путем...

Получить третий массив методом слияния первых двух массивов
Даны два одномерных числовых массива, упорядоченных по возрастанию. Получить третий массив методом...


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

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