友情支持

如果您觉得这个笔记对您有所帮助,看在D瓜哥码这么多字的辛苦上,请友情支持一下,D瓜哥感激不尽,😜

支付宝

微信

有些打赏的朋友希望可以加个好友,欢迎关注D 瓜哥的微信公众号,这样就可以通过公众号的回复直接给我发信息。

wx jikerizhi

公众号的微信号是: jikerizhi因为众所周知的原因,有时图片加载不出来。 如果图片加载不出来可以直接通过搜索微信号来查找我的公众号。

Cyclic Sort 循环排序

这种模式讲述的是一直很好玩的方法:可以用来处理数组中的数值限定在一定的区间的问题。这种模式一个个遍历数组中的元素,如果当前这个数它不在其应该在的位置的话,咱们就把它和它应该在的那个位置上的数交换一下。你可以尝试将该数放到其正确的位置上,但这复杂度就会是O(n2)。这样的话,可能就不是最优解了。因此循环排序的优势就体现出来了。

cyclic sort 01

循环排序适用的场景:

  • 包含连续数字的数组(如 1 到 n 或 0 到 n-1)

  • 需要找出缺失/重复数字的问题

  • 需要原地排序且时间复杂度要求高的情况

怎么鉴别这种模式?

  • 这些问题一般设计到排序好的数组,而且数值一般满足于一定的区间

  • 如果问题让你需要在排好序/翻转过的数组中,寻找丢失的/重复的/最小的元素

代码模板

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
/**
 * 循环排序
 *
 * @author D瓜哥 · https://www.diguage.com
 * @since 2025-10-18 19:19:45
 */
public void cyclicSort(int[] nums) {
  for (int i = 0; i < nums.length; i++) {
    while (nums[i] != i) {
      // 只要坐标上数跟坐标不相等就交换
      int temp = nums[i];
      nums[i] = nums[temp];
      nums[temp] = temp;
    }
  }
}

经典题目

Cyclic Sort (easy)

Find the Missing Number (easy)

Find all Missing Numbers (easy)

Find the Duplicate Number (easy)

Find all Duplicate Numbers (easy)

参考资料