互联网技术 / 互联网资讯 · 2024年3月28日

调整数组元素顺序的基本思路

前言

我们有一个整数数组,想按一定规则把元素重新排序。一个常见目标是:将数组中的奇数放在前半部分,偶数留在后半部分。

实现思路

用一个实例来说明:假设有数组 [2, 4, 5, 6, 7, 8, 9, 11],将奇数移到前面后得到 [11, 9, 7, 5, 6, 8, 4, 2] 的排序结果(这里顺序并非唯一,核心是奇数在前、偶数在后)。

通过观察发现,只要在扫描过程中遇到偶数出现在奇数的前面,就把它们的位置交换一次,排序目标就能基本达到。

因此,可以使用双指针的思路:一个指针从头部向后移动,另一个指针从尾部向前移动。

在两个指针未相遇之前,前指针始终在前,若前指针指向的是偶数、后指针指向的是奇数,就交换这两个数字。

下面用图示描述上述交换过程的示例:

调整数组元素顺序,你了解几分?

实现代码

思路确定后,来看实现代码的要点:

// 指向数组元素的两个指针:一个指向数组头部、一个指向数组尾部

调整数组中奇数与偶数元素的位置:奇数在前,偶数在后

若出现“奇前偶后”的错误排列,可以继续通过双指针的判定条件来修正。

如果题目再变成:把所有负数排在非负数前面,问题的核心仍然是双指针的逻辑不变,只是内层判断条件需要调整。

为了提高可扩展性,可以把判断条件提取成独立的函数,再把它作为参数传入,使代码对不同分组需求具备更好的可扩展性。

最后,给出实现要点的代码示例:

// 元素排序

我们先测试“奇数在偶数前面”的处理函数,看看能否正确执行,示例如下:

执行结果如下所示:

调整数组元素顺序,你了解几分?

再测试 ReoRdeR 函数的正确性:

// 负数在前

被 3 整除的数应排在数组最前面

调整数组元素顺序,你了解几分?

示例代码

文中所举的完整代码示例,请继续阅读下一节。