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

Слить два упорядоченных массива в третий - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Получить новую матрицу путем сложения http://www.cyberforum.ru/cpp-beginners/thread812201.html
Получить новую матрицу путем сложения всех элементов данной матрицы с ее наименьшим по модулю элементом. РАБОТА С ФУНКЦИЯМИ.. #include <stdio.h> #include <math.h> #include <locale> #include <conio.h> #include <time.h> #define MAX 10
C++ Побитовые операции (подсчитать количество парных нулевых битов, расположенных строго между единичными) Как подсчитать кол-во парных нулевых битов, расположенных строго между единичными? http://www.cyberforum.ru/cpp-beginners/thread812195.html
C++ Шаблон функции. Некорректная работа
Здравствуйте. Проблема такая: ниже приведенный код почему то некорректно отображает вызовы со всеми последующими массивами после float в качестве аргументов. Подскажите пожалуйста почему? И как исправить? #include <iostream> using namespace std; template<class Val> ////////////////////////////////////////// Val avg( Val* arr, const int SIZE ) { for( int j = 0; j < SIZE; j++)
C++ Проверить, что все слова заданной строки упорядочены в лексикографическом порядке (как в словаре)
Проверить, что все слова заданной строки упорядочены в лексикографическом порядке (как в словаре). помогите решить задачку на с++ :cry:
C++ Написать функцию, которая вычисляет среднее арифметическое элементов непустого списка http://www.cyberforum.ru/cpp-beginners/thread812170.html
Написать функцию, которая вычисляет среднее арифметическое элементов непустого списка.
C++ Подскажите алгоритм разложения числа по степеням Есть какое то число, его надо разложить по основанию 2^13 (2 в 13 степени) и вывести коэффициенты разложения в массив, то есть например число 341=341*(2^13)^0 то есть в массив записываем число 341 или число 8195=1*(2^13)^1+3*(2^13)^0 то есть в массив записывается два значения 1 и 3. Напишите пожалуйста код такого разложения. подробнее

Показать сообщение отдельно
UnsKneD
алкокодер
154 / 150 / 11
Регистрация: 27.12.2012
Сообщений: 548
19.03.2013, 00:06     Слить два упорядоченных массива в третий
Вставлю и свои 5 копеек
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
#include "stdafx.h"
 
void sortCycleMerge(int *A, int n){
    int i,i1,i2,s,k;
    for (s=1; 1; s*=2){               // Размер группы кратен степени 2
        int nn=n/s;                   // Количество групп по s элементов
        if( n%s!=0 ){ nn++; }         // Остаток – есть неполная группа
        int n1=nn/2*s;                // Деление ближе к середине,
        int n2=n-n1;                  // но кратно размеру группы
        
        if (n1<=0 || n2<=0) { return; }       // Часть больше целого - выход
        int *B1=new int[n1],
            *B2=new int[n2];
        
        for (i=0; i<n1; i++){ B1[i]=A[i]; }   // Разделение на части
        for (i=0; i<n2; i++){ B2[i]=A[i+n1]; }
        i1=i2=0;
        for (i=0,k=0; i<n; i++){           // Слияние с переходом «скачком»
            if (i1==s && i2==s){            // при достижении границ обеих
                k+=s,
                    i1=0,
                        i2=0;            // групп
            }
            if (i1==s || k+i1==n1){ A[i]=B2[k+i2++]; }  // Достигла границы группы или
            else{ if (i2==s || k+i2==n2) { A[i]=B1[k+i1++]; }                       // массива
                else if (B1[k+i1 ] < B2[k+i2 ]) { A[i]=B1[k+i1++]; }      // Если нет – минимальный из пары
                   else A[i]=B2[k+i2++];
            }
                    
        }
        delete []B1; delete []B2;
    }
 }
 
void sortCycleMergeAB(int *a, int N, int *b, int M, int *c){
    sortCycleMerge(a, N); 
    sortCycleMerge(b, M);
    for (int i = 0, j = 0, k = 0; k < N+M; k++){
        if (i == N) { 
            c[k] = b[j++]; 
            continue; 
        }
        if(j == M){ 
            c[k] = a[i++]; 
            continue; 
        }
        c[k] = (a[i] < b[j]) ? a[i++] : b[j++];
    }
};
 
void main( void ){
    int A[] = {9,8,7,6,5,4};
    int B[] = {3,2,1,-1,0};
    int C[sizeof(A)/sizeof(int)+sizeof(B)/sizeof(int)];
 
    sortCycleMergeAB(A, sizeof(A)/sizeof(int), B, sizeof(B)/sizeof(int), C);
 
    for( int i = 0; i< sizeof(A)/sizeof(int)+sizeof(B)/sizeof(int); i++){
        printf("%d ",C[i]);
    }
    printf("\n");
}
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru