Сортировка списка кортежей с использованием небиблиотечной функции сортировки (Python) - PullRequest
0 голосов
/ 28 апреля 2018

Как указано выше, мне нужно использовать функцию небиблиотечной сортировки, в частности функцию сортировки слиянием, которую я реализовал в предыдущем назначении. Мое задание работает очень хорошо, используя activity_arr.sort(key=operator.itemgetter(2)). Тем не менее, требования требуют, чтобы я использовал эту функцию:

def merge_sort(array):
''' Sorts an array using merge sort algorithm.'''
if len(array) > 1:
    # '//' is for "floor division", used in case array is filled with floats
    mid = len(array) // 2
    left = array[:mid]
    right = array[mid:]

    # Recursion to sort left and right half of array
    merge_sort(left)
    merge_sort(right)

    i = 0
    j = 0
    k = 0

    while i < len(left) and j < len(right):
        if left[i] < right[j]:
            array[k] = left[i]
            i += 1
        else:
            array[k] = right[j]
            j += 1
        k += 1
    # Fill the rest of the array with remaining numbers in each array
    while i < len(left):
        array[k] = left[i]
        i += 1
        k += 1
    while j < len(right):
        array[k] = right[j]
        j += 1
        k += 1

Полагаю, мне придется изменить его, чтобы я мог отсортировать свой список кортежей. Пример моего списка для сортировки: example_list = [(1, 3, 4), (7, 2, 5), (1, 2, 1)]. Я хочу отсортировать в порядке возрастания по третьему элементу кортежа. ТАК это должно привести к следующему: sorted_list = [(1, 2, 1), (1, 3, 4), (7, 2, 5)].

Я все еще изучаю Python, и мне еще многое предстоит выучить в CS. Я понятия не имею, как сделать это изменение, несмотря на множество исследований, в которых я нахожу людей, которые говорят, что используют .sort () Если я пропустил что-то важное, пожалуйста, дайте мне знать! Буду очень признателен за любую помощь или информацию для поиска. Спасибо!

1 Ответ

0 голосов
/ 28 апреля 2018

Вы можете передать индекс, по которому вы хотите отсортировать массив кортежей. Например, если вы хотите отсортировать массив на основе индекса 2 (индексирование начинается с 0), вы можете использовать его как: merge_sort(example_list,2). Идея проста, вы должны сравнить элемент на основе указанного индекса, как я сделал это здесь: if left[i][index] < right[j][index]:

def merge_sort(array,index):         #edit here
''' Sorts an array using merge sort algorithm.'''
if len(array) > 1:
    # '//' is for "floor division", used in case array is filled with floats
    mid = len(array) // 2
    left = array[:mid]
    right = array[mid:]

    # Recursion to sort left and right half of array
    merge_sort(left,index)        #edit here
    merge_sort(right,index)       #edit here

    i = 0
    j = 0
    k = 0

    while i < len(left) and j < len(right):
        if left[i][index] < right[j][index]:      #edit here
            array[k] = left[i]
            i += 1
        else:
            array[k] = right[j]
            j += 1
        k += 1
    # Fill the rest of the array with remaining numbers in each array
    while i < len(left):
        array[k] = left[i]
        i += 1
        k += 1
    while j < len(right):
        array[k] = right[j]
        j += 1
        k += 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...