Order a 6-element list ascending by repeatedly picking the smallest remaining value. Each iteration takes min(remaining), appends it to result, and removes it from remaining. The trace shows remaining shrinking and result growing one element at a time.

By hand

Initialize remaining as a copy of values. Repeat len(values) times: find min(remaining), append it to result, remove it from remaining.

naive.py
Replay: real traced execution (multi-file project)
values = [3, 1, 4, 1, 5, 9]
remaining = list(values)
result = []
for _ in range(len(values)):
    m = min(remaining)
    result.append(m)
    remaining.remove(m)
print('RESULT:', result)
  1. values ← [3, 1, 4, 1, 5, 9]

    1values = [3, 1, 4, 1, 5, 9]2remaining = list(values)
    values this step[3, 1, 4, 1, 5, 9]values
  2. remaining ← [3, 1, 4, 1, 5, 9]

    1values = [3, 1, 4, 1, 5, 9]2remaining = list(values)3result = []
    values this step[3, 1, 4, 1, 5, 9]remaining
  3. result ← []

    2remaining = list(values)3result = []4for _ in range(len(values)):
    values this step[]result
  4. _ ← 0

    3result = []4for _ in range(len(values)):5    m = min(remaining)
    values this step0_
  5. m ← 1

    4for _ in range(len(values)):5    m = min(remaining)6    result.append(m)
    values this step1m
  6. result ← [1]

    5m = min(remaining)6result.append(m)7remaining.remove(m)
    values this step[] [1]result
  7. remaining ← [3, 4, 1, 5, 9]

    6    result.append(m)7    remaining.remove(m)8print('RESULT:', result)
    values this step[3, 1, 4, 1, 5, 9] [3, 4, 1, 5, 9]remaining
  8. _ ← 1

    3result = []4for _ in range(len(values)):5    m = min(remaining)
    values this step0 1_
  9. m = min(remaining)

    4for _ in range(len(values)):5    m = min(remaining)6    result.append(m)
  10. result ← [1, 1]

    5m = min(remaining)6result.append(m)7remaining.remove(m)
    values this step[1] [1, 1]result
  11. remaining ← [3, 4, 5, 9]

    6    result.append(m)7    remaining.remove(m)8print('RESULT:', result)
    values this step[3, 4, 1, 5, 9] [3, 4, 5, 9]remaining
  12. _ ← 2

    3result = []4for _ in range(len(values)):5    m = min(remaining)
    values this step1 2_
  13. m ← 3

    4for _ in range(len(values)):5    m = min(remaining)6    result.append(m)
    values this step1 3m
  14. result ← [1, 1, 3]

    5m = min(remaining)6result.append(m)7remaining.remove(m)
    values this step[1, 1] [1, 1, 3]result
  15. remaining ← [4, 5, 9]

    6    result.append(m)7    remaining.remove(m)8print('RESULT:', result)
    values this step[3, 4, 5, 9] [4, 5, 9]remaining
  16. _ ← 3

    3result = []4for _ in range(len(values)):5    m = min(remaining)
    values this step2 3_
  17. m ← 4

    4for _ in range(len(values)):5    m = min(remaining)6    result.append(m)
    values this step3 4m
  18. result ← [1, 1, 3, 4]

    5m = min(remaining)6result.append(m)7remaining.remove(m)
    values this step[1, 1, 3] [1, 1, 3, 4]result
  19. remaining ← [5, 9]

    6    result.append(m)7    remaining.remove(m)8print('RESULT:', result)
    values this step[4, 5, 9] [5, 9]remaining
  20. _ ← 4

    3result = []4for _ in range(len(values)):5    m = min(remaining)
    values this step3 4_
  21. m ← 5

    4for _ in range(len(values)):5    m = min(remaining)6    result.append(m)
    values this step4 5m
  22. result ← [1, 1, 3, 4, 5]

    5m = min(remaining)6result.append(m)7remaining.remove(m)
    values this step[1, 1, 3, 4] [1, 1, 3, 4, 5]result
  23. remaining ← [9]

    6    result.append(m)7    remaining.remove(m)8print('RESULT:', result)
    values this step[5, 9] [9]remaining
  24. _ ← 5

    3result = []4for _ in range(len(values)):5    m = min(remaining)
    values this step4 5_
  25. m ← 9

    4for _ in range(len(values)):5    m = min(remaining)6    result.append(m)
    values this step5 9m
  26. result ← [1, 1, 3, 4, 5, 9]

    5m = min(remaining)6result.append(m)7remaining.remove(m)
    values this step[1, 1, 3, 4, 5] [1, 1, 3, 4, 5, 9]result
  27. remaining ← []

    6    result.append(m)7    remaining.remove(m)8print('RESULT:', result)
    values this step[9] []remaining
  28. for _ in range(len(values)):

    3result = []4for _ in range(len(values)):5    m = min(remaining)
  29. stdout ← RESULT: [1, 1, 3, 4, 5, 9]

    7    remaining.remove(m)8print('RESULT:', result)
    values this stepRESULT: [1, 1, 3, 4, 5, 9]stdout

With NumPy

np.sort(a) returns a new sorted array. The original a is unchanged.

library.py
import numpy as np

values = [3, 1, 4, 1, 5, 9]
a = np.array(values)
result = np.sort(a)
print('a: shape:', a.shape, 'dtype:', a.dtype, 'values:', a.tolist())
print('result: shape:', result.shape, 'dtype:', result.dtype, 'values:', result.tolist())
print('RESULT:', result.tolist())
a: shape: (6,) dtype: int64 values: [3, 1, 4, 1, 5, 9]
result: shape: (6,) dtype: int64 values: [1, 1, 3, 4, 5, 9]
RESULT: [1, 1, 3, 4, 5, 9]

Implementation notes

  • np.sort(a) returns a copya is unmodified. To sort in place use a.sort() (a method on the array), which modifies a and returns None.
  • Default sort order is ascending. For descending order use np.sort(a)[::-1] (sort first, then reverse the result).
  • This lesson teaches sort usage. The underlying algorithms (quicksort, mergesort, heapsort, timsort) are covered in the DSA track.
  • Shape, dtype, and values are shown explicitly here because ndarray.__repr__ output varies with NumPy version and print options.