Wyszukiwanie max lub min

WPROWADZENIE


SPECYFIKACJA
Problem: 
Wyszukiwanie największego elementu w nieuporządkowanym ciągu liczb.

DANE WEJŚCIOWE
Ciąg n liczb umieszczonych w tablicy L. 

DANE WYJŚCIOWE
Pozycja (indeks) elementu największego w ciągu L.

Zadanie znajdowania elementu maksymalnego (minimalnego) jest typowym zadaniem wyszukiwania, które rozwiązujemy przy pomocy algorytmu wyszukiwania liniowego. Za tymczasowy maksymalny (minimalny) element przyjmujemy pierwszy element zbioru. Następnie element tymczasowy porównujemy z kolejnymi elementami. Jeśli któryś z porównywanych elementów jest większy (mniejszy) od elementu tymczasowego, to za nowy tymczasowy element maksymalny (minimalny) przyjmujemy porównywany element zbioru. Gdy cały zbiór zostanie przeglądnięty, w elemencie tymczasowym otrzymamy element maksymalny (minimalny) w zbiorze. Algorytm jest optymalny (Ira Pohl, 1972).

Możliwe są dwa podejścia: zwracamy indeks największego elementu (dane w tablicy) lub zwracamy sam element największy (dane w tablicy lub w pliku). Jeżeli dostęp do danych jest sekwencyjny, to lepiej jest zwracać sam element największy (a raczej jego kopię).

Zajmiemy się implementacją funkcji zwracającej indeks największego elementu na liście (w zadanym przedziale indeksów). Dla zbioru n liczb musimy wykonać (n-1) porównań. Wyszukiwanie elementu najmniejszego jest analogiczne.

WYSZUKIWANIE MAX LUB MIN W PYTHONIE


min(arg1, arg2, *args, *[, key])   # dwa lub więcej argumentów
min(iterable[, key=func])   # Py2, jeden argument
min(iterable, *[, key, default])   # Py3.4, jeden argument

max(arg1, arg2, *args, *[, key])   # dwa lub więcej argumentów
max(iterable[, key=func])   # Py2, jeden argument
max(iterable, *[, key, default])   # Py3.4, jeden argument

# The 'default' argument specifies an object to return if the provided
# iterable is empty. If the iterable is empty and default is not provided,
# a ValueError is raised.

IMPLEMENTACJA


def find_max(L, left, right):
    """Wyszukiwanie indeksu elementu największego."""
    k = left
    i = left + 1
    while i <= right:
        if L[i] > L[k]:
            k = i
        i += 1
    return k

def find_min(L, left, right):
    """Wyszukiwanie indeksu elementu najmniejszego."""
    k = left
    i = left + 1
    while i <= right:
        if L[i] < L[k]:
            k = i
        i += 1
    return k

# Pythonowa symulacja wyszukiwania elementu największego w pliku.
def find_max(afile):
    best = None
    for item in afile:
        if best is None:
            best = item
        elif item > best:
            best = item
    return best

SELECTSORT

Algorytm wyszukiwania liniowego jest wykorzystywany w algorytmie sortowania przez wybór. W sposób ciągły wybieramy najmniejszy element z coraz mniejszego zbioru danych.