📜  门| GATE-CS-2002 |问题 27(1)

📅  最后修改于: 2023-12-03 14:58:25.126000             🧑  作者: Mango

问题 27: 排序习题

这是一道经典的排序习题,需要你实现一个算法,将一个由整数组成的序列排序,并且要求在排序过程中将所有的偶数移动到序列的前面,所有的奇数移动到序列的后面。例如,输入 [2,1,4,3,6,5,8,7,10,9] ,输出为 [2,4,6,8,10,1,3,5,7,9] 。

你需要完成的函数为 sort_array(nums: List[int]) -> List[int] ,其中:

  • nums: List[int] 表示输入的整数序列,其中元素的取值范围是 [-10^6, 10^6] ,序列的长度范围是 [1, 10^5] 。

该题需要你实现时间复杂度为 O(n) 的算法,请按照以下步骤设计代码:

  1. 使用两个指针 i 和 j ,分别指向序列的头部和尾部。

  2. 当 i < j 时,则执行以下步骤:

    1. 如果 nums[i] 为偶数,则继续向右移动 i 。

    2. 如果 nums[j] 为奇数,则继续向左移动 j 。

    3. 如果 nums[i] 为奇数,nums[j] 为偶数,则交换 nums[i] 和 nums[j] 。

    4. 最后,i 和 j 继续向右移动和向左移动。

  3. 当 i >= j 时,表示已经完成了一次排列。

  4. 重复执行步骤二和三,直到完成排序。

以下是日期复杂度为 O(n) 的 Python 代码实现:

from typing import List

def sort_array(nums: List[int]) -> List[int]:
    i, j = 0, len(nums) - 1
    while i < j:
        if nums[i] % 2 == 0:
            i += 1
        elif nums[j] % 2 != 0:
            j -= 1
        else:
            nums[i], nums[j] = nums[j], nums[i]
            i += 1
            j -= 1
    return nums

你也可以在 LeetCode 题库的 977. Squares of a Sorted Array905. Sort Array By Parity 中找到与本题类似的排序题目。