Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
815 / 527 / 214
Регистрация: 22.12.2017
Сообщений: 1,495
1

Сортировка слиянием (Merge sort)

21.05.2022, 02:27. Показов 642. Ответов 2

Author24 — интернет-сервис помощи студентам
Пытаюсь реализовать сортировку слиянием на python(без рекурсии, чтоб не запутаться). Вопрос: Как сделать мой код более правильным алгоритмически? Можно ли вообще считать то что я написал - сортировкой слиянием?

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
def mergeSort(x):
    if len(x) < 2: return x
    y = []
    for i in range(0, len(x), 2):
        xy = x[i:i + 2]
        if xy[0] < xy[-1]:
            y.append(xy)
        else:
            y.append(xy[::-1])
    while len(y) > 1:
        c = y.pop(0)
        c.extend(y.pop(0))
        for _ in range(len(c)):
            for j in range(1, len(c)):
                if c[j - 1] > c[j]:
                    c[j - 1], c[j] = c[j], c[j - 1]
        y.append(c)
    return y[0]
 
from random import randint
 
x1 = [randint(1,21) for _ in range(10)]
print(x1, mergeSort(x1))
Добавлено через 54 минуты
и ещё один маленький дополнительный вопрос - если вызвать print(x1) ещё раз после основной программы - он будет отсортирован, как такое возможно?

Добавлено через 7 минут
ещё чуть-чуть поигрался - если вызвать print(x1) до и после последней строки(23) то всё выводит как положено
потом вернул как было - теперь x1 выводит как нужно, но для другой сортировки выводит одинаковые массивы(если вызывать в одном принте), правильно выводит только разными принтами, мне кажется что я схожу с ума
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.05.2022, 02:27
Ответы с готовыми решениями:

.sort() сортировка
есть некий массив (list) a, каждое значение которого - строка массив а сформирован поэлементным...

Сортировка .sort
Здравствуйте, подскажите пожалуйста как отсортировать числа в порядке возрастания a =...

Сортировка слиянием
Всем здравствуйте, пытаюсь реализовать алгоритм сортировки массива, но не понимаю что в моем коде...

Сортировка слиянием
Помогите пожалуйста! Нужно написать программу, выполняющую сортировку слиянием с описанием каждой...

Сортировка слиянием
Написать функцию, которая принимает на вход любой массив/список и выдает все промежуточные списки,...

2
Модератор
Эксперт функциональных языков программированияЭксперт Python
37302 / 20736 / 4272
Регистрация: 12.02.2012
Сообщений: 34,127
Записей в блоге: 14
21.05.2022, 10:11 2
Цитата Сообщение от codcw Посмотреть сообщение
Можно ли вообще считать то что я написал - сортировкой слиянием?
- боюсь, что нет. Меня смущают строки 13-16

Добавлено через 3 минуты
Вот несовершенный вариант сортировки слиянием:

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
40
41
42
43
44
45
46
47
48
def merge(s1,s2):
    r=[]
    i,j=0,0
    while(True):
        if i>= len(s1):
            r+=s2[j:]
            break
        if j>= len(s2):
            r+=s1[i:]
            break
        if s1[i] < s2[j]:
            r+=[s1[i]]
            i+=1 
        else:
            r+=[s2[j]]
            j+=1
    return r
    
def mergeSort(x):
    xx=[]
    for a in x:
        xx=xx+[[a]]
    while(True):
        k=len(xx)
        if k==1:
            break
        yy=[]
        i=0
        j=1
        while(True):
            if i==k: 
                break
            if j==k:
                yy+=[xx[i]]
                break
            else:
                yy+=[merge(xx[i],xx[j])]
            i+=2
            j+=2
            
        xx=yy
    return xx[0]
 
z=mergeSort([1,2,3,1,2,3,1,2,3])
print(z)
 
z=mergeSort([1,3,-4,8,2,34])
print(z)
1
815 / 527 / 214
Регистрация: 22.12.2017
Сообщений: 1,495
22.05.2022, 15:04  [ТС] 3
Catstail,
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
def mergeSort(x):
    if len(x) < 2: return x
    y = []
    for i in range(0, len(x), 2):
        xy = x[i:i + 2]
        if xy[0] < xy[-1]:
            y.append(xy)
        else:
            y.append(xy[::-1])
    while len(y) > 1:
        r = []
        a = y.pop(0)
        b = y.pop(0)
        while True:
            if a and b:
                if a[0] < b[0]:
                    r.append(a.pop(0))
                else:
                    r.append(b.pop(0))
            else:
                if b:
                    r.extend(b)
                    break
                elif a:
                    r.extend(a)
                    break
                else:
                    break
        y.append(r)
    return y[0]
 
from random import randint
 
x1 = [randint(1,21) for _ in range(10)]
 
print(x1)
print(mergeSort(x1))
переделал
выходит, было неверно только из-за сортировки при самом слиянии? теперь всё в порядке? если да, как сделать лучше?
0
22.05.2022, 15:04
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.05.2022, 15:04
Помогаю со студенческими работами здесь

Сортировка слиянием
Помогите, пожалуйста, с ошибкой File &quot;Untitled3.py&quot;, line 43, in &lt;module&gt; ...

Сортировка слиянием
Нужно создать код (сортировка слиянием). Подойдёт ли этот? def merge_sort(alist, start, end): ...

Сортировка слиянием
def merge(l: list, r: list): c = * (len(l) + len(r)) i = k = n = 0 while i &lt; len(l)...

Сортировка слиянием
Помогите разобраться, почему не работает. Написал сортировку слиянием через 2 функции: одна...

Сортировка слиянием из файла
Нашел на просторах форума данный код и дополнил так, что бы он брал числа из файла def...

Сортировка слиянием на языке Питон
Помогите пожалуйста. Я никогда не работал с языком питон. помогите написать сортировку слиянием ...


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

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