友情支持
如果您觉得这个笔记对您有所帮助,看在D瓜哥码这么多字的辛苦上,请友情支持一下,D瓜哥感激不尽,😜
有些打赏的朋友希望可以加个好友,欢迎关注D 瓜哥的微信公众号,这样就可以通过公众号的回复直接给我发信息。
公众号的微信号是: jikerizhi 。因为众所周知的原因,有时图片加载不出来。 如果图片加载不出来可以直接通过搜索微信号来查找我的公众号。 |
Cyclic Sort 循环排序
这种模式讲述的是一直很好玩的方法:可以用来处理数组中的数值限定在一定的区间的问题。这种模式一个个遍历数组中的元素,如果当前这个数它不在其应该在的位置的话,咱们就把它和它应该在的那个位置上的数交换一下。你可以尝试将该数放到其正确的位置上,但这复杂度就会是O(n2)。这样的话,可能就不是最优解了。因此循环排序的优势就体现出来了。

循环排序适用的场景:
-
包含连续数字的数组(如 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;
}
}
}