Skip to content

Commit e727f36

Browse files
Fix negative indexing bug and improve readability in wiggle_sort
Issue: - The previous implementation used `enumerate(nums)`, starting the loop at `i = 0`. This caused `nums[i - 1]` to evaluate to `nums[-1]`, accidentally comparing (and potentially swapping) the first element with the last element of the array on the first iteration. - The conditional logic `(i % 2 == 1) == (nums[i - 1] > nums[i])` was convoluted, hard to read, and triggered unnecessary swaps when adjacent numbers were equal. Fix: - Changed the loop to use `range(1, len(nums))` to ensure the index safely starts at 1, eliminating the negative indexing bug. - Replaced the confusing equality check with explicit `if/elif` statements that clearly define the peak (odd indices) and valley (even indices) requirements of a Wiggle Sort. - Preserved all original docstrings and the __main__ block as-is.
1 parent c6012e3 commit e727f36

1 file changed

Lines changed: 7 additions & 3 deletions

File tree

‎sorts/wiggle_sort.py‎

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,9 @@
1111

1212
def wiggle_sort(nums: list) -> list:
1313
"""
14-
Python implementation of wiggle.
14+
Python implementation of wiggle sort.
15+
Reorders an array such that nums[0] <= nums[1] >= nums[2] <= nums[3]...
16+
1517
Example:
1618
>>> wiggle_sort([0, 5, 3, 2, 2])
1719
[0, 5, 2, 3, 2]
@@ -22,8 +24,10 @@ def wiggle_sort(nums: list) -> list:
2224
>>> wiggle_sort([-2.1, -5.68, -45.11])
2325
[-45.11, -2.1, -5.68]
2426
"""
25-
for i, _ in enumerate(nums):
26-
if (i % 2 == 1) == (nums[i - 1] > nums[i]):
27+
for i in range(1, len(nums)):
28+
if i % 2 == 1 and nums[i - 1] > nums[i]:
29+
nums[i - 1], nums[i] = nums[i], nums[i - 1]
30+
elif i % 2 == 0 and nums[i - 1] < nums[i]:
2731
nums[i - 1], nums[i] = nums[i], nums[i - 1]
2832

2933
return nums

0 commit comments

Comments
 (0)