Sorting and Unique
Sort Array
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)
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]valuesremaining ← [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]remainingresult ← []
2remaining = list(values)3result = []4for _ in range(len(values)):values this step[]result_ ← 0
3result = []4for _ in range(len(values)):5 m = min(remaining)values this step0_m ← 1
4for _ in range(len(values)):5 m = min(remaining)6 result.append(m)values this step1mresult ← [1]
5m = min(remaining)6result.append(m)7remaining.remove(m)values this step[] → [1]resultremaining ← [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_ ← 1
3result = []4for _ in range(len(values)):5 m = min(remaining)values this step0 → 1_m = min(remaining)
4for _ in range(len(values)):5 m = min(remaining)6 result.append(m)result ← [1, 1]
5m = min(remaining)6result.append(m)7remaining.remove(m)values this step[1] → [1, 1]resultremaining ← [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_ ← 2
3result = []4for _ in range(len(values)):5 m = min(remaining)values this step1 → 2_m ← 3
4for _ in range(len(values)):5 m = min(remaining)6 result.append(m)values this step1 → 3mresult ← [1, 1, 3]
5m = min(remaining)6result.append(m)7remaining.remove(m)values this step[1, 1] → [1, 1, 3]resultremaining ← [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_ ← 3
3result = []4for _ in range(len(values)):5 m = min(remaining)values this step2 → 3_m ← 4
4for _ in range(len(values)):5 m = min(remaining)6 result.append(m)values this step3 → 4mresult ← [1, 1, 3, 4]
5m = min(remaining)6result.append(m)7remaining.remove(m)values this step[1, 1, 3] → [1, 1, 3, 4]resultremaining ← [5, 9]
6 result.append(m)7 remaining.remove(m)8print('RESULT:', result)values this step[4, 5, 9] → [5, 9]remaining_ ← 4
3result = []4for _ in range(len(values)):5 m = min(remaining)values this step3 → 4_m ← 5
4for _ in range(len(values)):5 m = min(remaining)6 result.append(m)values this step4 → 5mresult ← [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]resultremaining ← [9]
6 result.append(m)7 remaining.remove(m)8print('RESULT:', result)values this step[5, 9] → [9]remaining_ ← 5
3result = []4for _ in range(len(values)):5 m = min(remaining)values this step4 → 5_m ← 9
4for _ in range(len(values)):5 m = min(remaining)6 result.append(m)values this step5 → 9mresult ← [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]resultremaining ← []
6 result.append(m)7 remaining.remove(m)8print('RESULT:', result)values this step[9] → []remainingfor _ in range(len(values)):
3result = []4for _ in range(len(values)):5 m = min(remaining)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 copy —ais unmodified. To sort in place usea.sort()(a method on the array), which modifiesaand returnsNone.- 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.