Python程序:根据其二进制表示中的1的计数对数字进行排序

2025年1月5日 | 阅读 5 分钟

要在 Python 中根据数字二进制表示中 1 的数量对其进行排序,首先将每个数字转换为其二进制形式。其次,计算二进制表示中的 1 的数量。最后,根据这个数量对数字进行排序。为此,我们将利用按位运算符和 Python 自带的排序实用程序。

  • 首先,我们将定义一个函数来检查数字的二进制表示中有多少个 1。我们将通过将数字与 1 进行按位 AND 操作来检查最低有效位是否为 1,然后将数字向右移位直到它变为零来实现。
  • 接下来,此函数将用作 Python 中列表或 sorted() 函数的键。使用 sort() 方法根据其二进制表示中的 1 的数量对数字进行排序。

以下是实现此目的的 Python 代码

代码

输出

Original numbers: [7, 4, 11, 13, 8]
Sorted numbers based on number of 1s in their binary representation: [4, 8, 7, 11, 13]

让我们分解一下代码

  • count_ones(n): 此函数接受一个整数 n 作为输入,并以二进制形式输出 1 的计数。它通过使用 while 循环遍历 n 的二进制版本,并在初始化计数变量为 0。在每个循环中,它会与 1 进行按位 AND 操作,以查看最低有效位是否为 1。如果为 1,则增加计数。然后,将 n 向右移动一位,直到它等于 0。
  • sort_by_binary_ones(numbers): 此函数用于根据每个数字的二进制形式中包含的 1 的数量对数字列表进行排序。它在 Python 的 sorted() 方法中使用 count_ones 函数作为键参数。
  • 示例用法: 我们定义一个数字列表,然后使用 sort_by_binary_ones() 函数对它们进行排序。最后,我们打印原始列表和排序后的列表以查看结果。

让我们更详细地说明排序过程是如何工作的。

在排序之前,当我们使用 sorted(numbers, key=count_ones) 时,Python 会在内部对列表中的每个数字应用 count_ones 函数。Python 现在可以根据 count_ones 的结果对整数进行排序。

让我们逐步使用示例列表 [7, 4, 11, 13, 8] 来概述排序过程

1. 原始列表

2. 应用 count_ones 函数

3. 带有 1 计数的中间列表

4. 按 1 的计数排序

按 1 的计数排序(并保持相等项的原始顺序)

5. 排序后的列表

效率

此计算的时间复杂度取决于两个变量

1. 计算二进制表示中的 1 的数量(count_ones 函数)

  • 此操作的时间复杂度取决于数字二进制表示中的位数,通常为 O(log n),其中 n 是数字的值。
  • 在最坏的情况下,如果数字很大,计算 1 的数量可能需要 O(log n) 时间。

2. 排序

  • 所使用的排序算法决定了排序的复杂度。Timsort 是 Python 中的内置排序算法,通常具有 O(n log n) 的平均和最坏情况时间复杂度。
  • O(n log n),其中 n 是列表中元素的数量,是总体时间复杂度,因为 count_ones 函数对每个数字调用一次。

边缘情况

1. 处理负数

  • 对于正数和负数,count_ones 函数都可以准确地处理。负数在 Python 中使用二补码形式表示。
  • 符号位(最左边的位)对于负数是 1。然而,count_ones 函数继续计算每一位,包括符号位。

2. 处理零

  • 零在其二进制表示中没有 1,因此它将排在排序列表的开头。
  • 这种行为是正确的,因为我们是根据 1 的计数进行排序,而零的计数最少。

3. 处理大数

  • 该算法有效地处理大数量。即使对于大数字,二进制表示也非常高效,因为计算 1 的数量的时间复杂度随数字大小呈对数增长。

结论

总之,一个 Python 算法,它可以有效地将每个数字转换为其二进制形式,计算 1 的数量,然后根据该计数对数字进行排序,可以用于根据其二进制表示中的 1 的数量对数字进行排序。count_ones 函数(用于检查二进制格式中的 1)的时间复杂度为 O(log n),其中 n 是数字的值。利用 Python 内置的排序功能,排序方法的总体时间复杂度通常为 O(n log n)。此方法通过处理各种边缘情况(例如负数、零、大数和重复项)来确保准确的排序结果。该算法提供了一种可靠且高效的方法来根据二进制 1 的数量排列整数,这使其在需要此类排序的各种情况下都很有用。