Статья Автор: Лебедев Дмитрий

TUZ_3-21 Сортировка чисел по количеству цифр

TUZ_3-21 Сортировка чисел по количеству цифр

TUZ_3-21 Сортировка чисел по количеству цифр
3.21 Сортировка чисел по количеству цифр
Стандартная операция сравнения чисел говорит нам, что число 101 больше числа 9.
Однако в контексте сортировки по значениям цифр число 9 больше, чем 101.
Целью этой задачи является сортировка массива чисел по количеству составляющих их цифр.
Например, рассмотрим массив array = [81181972, 8111972], и пусть a = 81181972 и b = 8111972.
Сравнение начинается с наибольшей цифры, в данном случае это 9.
Оба числа имеют по одной цифре 9, поэтому сравнивается следующая по величине цифра – цифра 8.
В a две восьмерки, а в b – одна, поэтому считается, что a больше.
В общем случае сравнение выполняется следующим образом: если в a и b имеется одинаковое количество цифр
с одним и тем же значением, то проверяется следующая цифра, меньшая по величине.
Так продолжается до тех пор, пока не будет найдено отличие или пока не будут исчерпаны все цифры в числах.
Ваша задача: написать функцию, которая принимает массив положительных целых чисел и возвращает массив,
отсортированный по количеству цифр.
В табл. 3.21 показаны ожидаемые результаты для некоторых входных данных.
Таблица 3.21. Некоторые ожидаемые результаты для задачи сортировки чисел по количеству цифр 
Array Ожидаемый результат 
[81181972, 9, 123198776, 23, 456, 1] [1, 23, 456, 9, 123198776, 81181972]
[1, 2, 3, 11, 9, 77, 66, 87, 111] [1, 11, 111, 2, 3, 66, 77, 87, 9]
[39, 456, 0, 7, 3, 599] [0, 3, 456, 7, 39, 599]
[] []

Алгоритм
Стратегия «разделяй и властвуй» – это метод решения задач, предполагающий деление сложной задачи на более мелкие,
более управляемые подзадачи и решение каждой подзадачи отдельно.
Алгоритм сортировки слиянием как раз основан на стратегии «разделяй и властвуй».
Он многократно делит заданный список на подсписки, пока в каждом подсписке не останется только один элемент.
Эти подсписки затем объединяются вместе, образуя отсортированный список.
Алгоритм (сортировки слиянием) сначала рекурсивно делит входной массив на две половины,
пока не будет достигнут базовый вариант с одним элементом или пустой массив.
Затем он определяет, какой из двух элементов должен следовать первым, основываясь на количестве их цифр.
Наконец, два отсортированных подмассива объединяются в порядке сортировки.

В листинге 3.21 приводится код на Python, сортирующий числа по коли- честву цифр.
Листинг 3.21. Сортировка чисел по количеству цифр
1 def sort_by_digit_count(arr):
2     """
3     Сортирует массив положительных целых чисел
4     по количеству цифр.
5     """
6     # Применить алгоритм сортировки слиянием
7     if len(arr) > 1:
8         # Поиск середины массива
9         mid = len(arr) // 2
10
11         # Деление массива на две половины
12         L = arr[:mid]
13         R = arr[mid:]
14
15         # Сортировка первой половины
16         L = sort_by_digit_count(L)
17
18         # Сортировка второй половины
19         R = sort_by_digit_count(R)
20
21         # Объединить две отсортированные половины
22         i, j, k = 0, 0, 0
23         while i < len(L) and j < len(R):
24             if max_(L[i], R[j]) == R[j]:
25                 arr [k] = L[ i ]
26                 i += 1
27             else:
28                 arr[k] = R[j]
29                 j += 1
30             k += 1 31
32         '''Проверить, есть ли в первой половине
33         элемент, который должен стоять левее
34         '''
35         while i < len(L):
36             arr[k] = L[i]
37             i += 1
38             k += 1
39
40         '''Проверить, есть ли в правой половине
41         элемент, который должен стоять левее
42         '''
43         while j < len(R):
44             arr[k] = R[j]
45             j += 1 46             k += 1
47
48     return arr
49
50
51 def max_(a, b):
52     """
53     Принимает два положительных целых числа, a и b,
54     и возвращает то, в котором присутствует больше цифр
55     с бóльшим значением. В случае равенства
56     возвращается большее число.
57
58     """
59     a, b = str(a), str(b)
60     for i in range(9, -1, -1):
61         if a.count(str(i)) > b.count(str(i)):
62             return int(a)
63         elif a.count(str(i)) < b.count(str(i)):
64             return int (b)
65     return max(int(a), int(b))


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