Mam następujący kod

def compare_and_swap(x, a, b):
    if x[a] > x[b]:
        x[a], x[b] = x[b], x[a]

def oddeven_merge(x, lo, hi, r):
    step = r * 2
    if step < hi - lo:
        oddeven_merge(x, lo, hi, step)
        oddeven_merge(x, lo + r, hi, step)
        for i in range(lo + r, hi - r, step):
            compare_and_swap(x, i, i + r)
    else:
        compare_and_swap(x, lo, lo + r)

def oddeven_merge_sort_range(x, lo, hi):
    """ sort the part of x with indices between lo and hi.

    Note: endpoints (lo and hi) are included.
    """
    if (hi - lo) >= 1:
        # if there is more than one element, split the input
        # down the middle and first sort the first and second
        # half, followed by merging them.
        mid = lo + ((hi - lo) / 2)
        oddeven_merge_sort_range(x, lo, mid)
        oddeven_merge_sort_range(x, mid + 1, hi)
        oddeven_merge(x, lo, hi, 1)

def oddeven_merge_sort(x):
    oddeven_merge_sort_range(x, 0, len(x)-1)

>>> data = [4, 3, 5, 6, 1, 7, 8]
>>> oddeven_merge_sort(data)
>>> data
[1, 2, 3, 4, 5, 6, 7, 8]

Wszystko jest dla mnie jasne, ale tylko ta linia nie może dobrze zrozumieć

 for i in range(lo + r, hi - r, step):

Jak mogę go przeczytać za pomocą kodu Pseudo? Lub w innych językach na przykład C ++?

2
dato datuashvili 23 październik 2011, 16:19

4 odpowiedzi

Linia

for i in range(lo + r, hi - r, step):

Jest pętlą za pętlę z I działa z lo+r do hi-r nie dołączono , według kroków step. Oto przykład:

>>> for i in range(10, 31, 3):
...     print i
...     
10
13
16
19
22
25
28

Należy pamiętać, że w range(start, end, step) wartości początkowy i końcowych można zamówić w dowolny sposób i że etap może być dodatni lub ujemny . To sprawia, że pisanie wersji C jest trochę kłopotliwe.

Tak więc, gdy znasz Python , for i in range(lo + r, hi - r, step jest pseudo-kodem : w rzeczywistości,

  • Jest to prawdopodobnie bardziej zwięzły i czytelny niż trochę pętli z inicjalizacją licznika, testu i przyrostu na trzech różnych liniach;
  • Ładnie obsługuje wszystkie przypadki objęte pytonem (zamawianie początku i końca, oraz znakiem kroku).
1
Eric O Lebigot 23 październik 2011, 12:30

Jak mogę go przeczytać za pomocą Pseudo Code?

Python jest bardzo blisko pseudokodu.

for i in range(lo + r, hi - r, step):

Oznacza dokładnie to, co mówi: wykonaj następujący kod z każdą wartością i w określonym range. Pierwsze dwie wartości są niższe i górne granice zakresu, a step jest odległością między wartościami do użycia. Aby uzyskać więcej informacji, spróbuj help(range) w monicie tłumacza Pythona.

1
Karl Knechtel 23 październik 2011, 14:26

Możesz przeczytać, że jako następujący kod pseudo (dla pozytywnych kroków):

i = lo + r
while i < hi - r:
    # body of loop
    i = i + step

Do negatywnych kroków:

i = lo + r
while i > hi - r:
    # body of loop
    i = i + step

Innymi słowy, iteruje zmienną i z pierwszej wartości, aż do osiągnięcia lub przekazuje drugą wartość, dostosowując ją za pomocą trzeciej wartości za każdym razem przez pętlę.

0
paxdiablo 23 październik 2011, 12:36

Jego pętla z lo + r (włącznie) do hi -r (ekskluzywna) w przyrostach step.

Zakładając, że krok jest dodatni, w językach C-takich jak można napisać jako:

 for (i = lo + r; i < hi - r; i += step) { ... } 

Innym sposobem na napisanie go w Pythonie:

 i = lo + r
 while i < hi - r:
      # loop body
      i += step

Jeśli krok jest ujemny, < staje się > w powyższym kodzie.

0
Mark Byers 23 październik 2011, 12:42