Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.72/25: Рейтинг темы: голосов - 25, средняя оценка - 4.72
0 / 0 / 0
Регистрация: 24.03.2020
Сообщений: 12

Слияние двух отсортированных массивов в один отсортированный слиянием. Исправьте, пожалуйста, ошибку

24.03.2020, 20:46. Показов 4727. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
В частности, нужно написать следующую процедуру
Процедура Merge (А, р, q, r).
Параметрами этой процедуры являются массив А и числа р, q, r, указывающие границы сливаемых участков.
Процедура предполагает, что р <= q < r и что участки А[р. .q] и A[q + 1. .r]
уже отсортированы, и сливает (merges) их в один участок А[p..r].

# На вход подаётся линейный массив, в котором две подряд идущие последовательности чисел отсортированы
# в неубывающем порядке,
# и индексы первого и последнего чисел одной последовательности и последнего числа второй
# Процедура объединяет эти две отсортированные последовательности в одну методом слияния.
C = [2, 3, 8, 11, 13, 1, 4, 7, 8, 8, 9]

Python
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
def merggge(A, p, q, r):
 
    p = int(p)
    q = int(q)
    r = int(r)
    x = int(r-p+1)
    B = [0]*x
    while p <= q < r:
        if A[q] > A[r]:
!            B[x] = A[q]
            x -= 1
            q -= 1
        if A[q] < A[r]:
            B[x] = A[p]
            x -= 1
            r -= 1
        if A[q] == A[r]:
            B[x] = A[q]
            B[x-1] = A[r]
            x -= 2
            q -= 1
            r -= 1
    while q < r:
        B[x] = A[r]
        x -= 1
        r -= 1
    while p <= q:
        B[x] = A[q]
        x -= 1
        q -= 1
    return B
merggge(C, 0, 4, 10)
в строке с восклицательным знаком возникает ошибка
B[x] = A[q]
IndexError: list assignment index out of range
уже долго не могу понять, в чём ошибка, в глаза долблюсь что ли
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
24.03.2020, 20:46
Ответы с готовыми решениями:

Массив: Объедините k отсортированных массивов в один отсортированный
Задание 3: Объедините k отсортированных массивов в один отсортированный. Пример: Входные данные: , , Выходные данные: заранее...

Сортировка слиянием двух отсортированных массивов
При нажатии на кнопку в textBox1 и textBox2 должны появиться два рандомных массива, а в textBox3 и textBox4 отсортированные разными...

Слияние двух массивов отсортированных по убыванию
Нужно написать прогу: Даны два массива. Массив А состоит из N элементов , массив В состоит из М элементов. Оба массива отсортированы...

5
Эксперт Python
 Аватар для unfindable_404
693 / 471 / 204
Регистрация: 22.03.2020
Сообщений: 1,051
24.03.2020, 22:43
Не могли бы вы переписать этот непонятный текст в формате кода. В Python как бы важно видеть отступы.
1
0 / 0 / 0
Регистрация: 24.03.2020
Сообщений: 12
24.03.2020, 22:47  [ТС]
Python
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
# На вход подаётся линейный массив, в котором две подряд идущие последовательности чисел отсортированы
# в неубывающем порядке,
# и индексы первого и последнего чисел одной последовательности и последнего числа второй
# Процедура объединяет эти две отсортированные последовательности в одну методом слияния.
C = [2, 3, 8, 11, 13, 1, 4, 7, 8, 8, 9]
 
 
def merggge(A, p, q, r):
 
    p = int(p)
    q = int(q)
    r = int(r)
    x = int(r-p+1)
    B = [0]*x
    while p <= q < r:
        if A[q] > A[r]:
            B[x] = A[q]
            x -= 1
            q -= 1
        if A[q] < A[r]:
            B[x] = A[p]
            x -= 1
            r -= 1
        if A[q] == A[r]:
            B[x] = A[q]
            B[x-1] = A[r]
            x -= 2
            q -= 1
            r -= 1
    while q < r:
        B[x] = A[r]
        x -= 1
        r -= 1
    while p <= q:
        B[x] = A[q]
        x -= 1
        q -= 1
    return B
merggge(C, 0, 4, 10)
да, не сразу сообразил, как это сделать
0
Эксперт Python
 Аватар для unfindable_404
693 / 471 / 204
Регистрация: 22.03.2020
Сообщений: 1,051
25.03.2020, 00:24
Лучший ответ Сообщение было отмечено Glamdr1ngg как решение

Решение

Во первых это не процедура, а функция, так как она возвращает итоговый список.
Во вторых вы меня простите, но это ужасные имена для переменных и я не смог разобраться в вашем коде, так что на ошибку я не укажу.
Но зато я переписал ваш ужас нормальными словами:
Python
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
#!/usr/bin/python3
 
C = [2, 3, 8, 11, 13, 1, 4, 7, 8, 8, 9]
 
 
def merggge(array, start_first, stop_first, stop_second):
    # Переменные для хранения текущего сравниваемого индекса
    cur_first = start_first
    cur_second = stop_first + 1
 
    # Итоговый список
    itog = []
 
    # Пока один из индексов не выйдет за свою границу
    while cur_first <= stop_first and cur_second <= stop_second:
 
        # Если текущий сравниваемый элемент первого массива меньше
        # текущего сравниваемого элемента второго массива
        if array[cur_first] <= array[cur_second]:
            # Добавляем меньший элемент в итоговый список
            itog.append(array[cur_first])
            # Увеличиваем индекс
            cur_first += 1
        else:
            # Добавляем меньший элемент в итоговый список
            itog.append(array[cur_second])
            # Увеличиваем индекс
            cur_second += 1
 
    # Добавляем в список оставшиеся элементы
    itog.extend(array[cur_first:stop_first + 1])
    itog.extend(array[cur_second:])
 
    return itog
 
 
print(merggge(C, 0, 4, 10))
2
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38167 / 21102 / 4307
Регистрация: 12.02.2012
Сообщений: 34,690
Записей в блоге: 14
25.03.2020, 07:47
Python
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
def part_merge(arr,p,q,r):
    tmp=[]
    i1=p
    i2=q+1
    while(True):
        if i1==q and i2==q+r:
            break
        if i1==q:
            for j in range(i2,q+r+1):
                tmp=tmp+[arr[j]]
            break
        if i2==q+r:
            for j in range(i1,q+1):
                tmp=tmp+[arr[j]]
            break
        if arr[i1]<arr[i2]:
            tmp=tmp+[arr[i1]]
            i1+=1
        else:
            tmp=tmp+[arr[i2]]
            i2+=1
    j=p
    for a in tmp:
        arr[j]=a
        j+=1
    return arr
    
print(part_merge([1,3,-1,4,5,6,11,-4,-3,0,1,2,3,7],2,6,6))
1
Status 418
Эксперт Python
4584 / 2350 / 601
Регистрация: 26.11.2017
Сообщений: 5,262
Записей в блоге: 3
25.03.2020, 11:08
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
def merge(a, p, q, r):
    i = p
    j = q + 1
    while i <= q and j <= r:
        if a[i] < a[j]:
            yield a[i]
            i += 1
        else:
            yield a[j]
            j += 1
    for x in a[i:q+1] + a[j:r+1]:
        yield x
 
arr = [2, 3, 8, 11, 13, 1, 4, 7, 8, 8, 9]
print(*merge(arr, 0, 4, 10))
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
25.03.2020, 11:08
Помогаю со студенческими работами здесь

Слияние двух отсортированных массивов в третий
Здравствуйте всем! Только начинаю изучать языки программирования. Помогите найти ошибку. Необходимо создать два массива, слить и...

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

Из двух отсортированных по возрастанию массивов сформировать третий, отсортированный также по возрастанию
Нужно написать программу с тремя массивами :| Из двух отсортированных по возрастанию массивов сформировать третий, отсортированный также...

Из двух отсортированных в убывающем порядке массивов получить новый массив, отсортированный в том же порядке
Народ помогите мне исправить вот этот код чтоб он правильно работал Program lab_6(Input,Output); Type Matrix=Array of integer; ...

Из двух отсортированных в убывающем порядке массивов получить новый массив, отсортированный в том же порядке
Народ,помогите пожалуйста, нужно из Из двух отсортированных в убывающем порядке массивов(одномерных) получить новый массив, отсортированный...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит: токи, напряжения и их 1 и 2 производные при t = 0;. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru