Cyclic Sort

curriculum problem — sort `nums` containing exactly the integers [1..n] in O(n) via in-place swap.

Easy
Time O(n) Space O(1)
2 min read
cyclic-sort

Problem#

(curriculum problem.) Given an array containing the integers [1..n] in some order with no duplicates and no extras, sort it in place in O(n) time.

Examples#

  • [3, 1, 5, 4, 2][1, 2, 3, 4, 5]

Constraints#

  • 1 <= n <= 10^5.

Approach#

For each i, swap nums[i] to its home position (nums[i] - 1) until nums[i] is already correct.

Solution#

Cyclic Sort
void cyclicSort(vector<int>& nums) {
int n = nums.size();
for (int i = 0; i < n; ) {
int target = nums[i] - 1;
if (nums[i] != nums[target]) swap(nums[i], nums[target]);
else ++i;
}
}

Editorial#

Linear because each swap places exactly one number in its final slot — total swaps ≤ n. The nums[i] != nums[target] check guards against the (impossible here) duplicate case but doubles as a “done” check.

Complexity#

  • Time: O(n).
  • Space: O(1).

Concept revision#

Search ESC

Keyboard shortcuts

Shortcuts are disabled while typing in inputs.