#6832. 二进制大小排序

二进制大小排序

二进制大小排序

题目描述

小明正在研究整数的二进制表示。

对于一个正整数,我们定义它的:

二进制长度

为该数字转换成二进制后,从最高位的 1 开始到最低位所包含的位数。

例如:

1 的二进制:1       长度为 1
5 的二进制:101     长度为 3
10 的二进制:1010   长度为 4

现在给定 n 个正整数,请按照以下规则排序:

  1. 二进制长度较大的数字排在前面;
  2. 如果两个数字的二进制长度相同,则数字较小的排在前面。

请输出排序后的结果。


输入格式

第一行包含一个整数:

n

表示数字的数量。

第二行包含 n 个正整数:

a1 a2 ... an

表示需要排序的数字。


输出格式

输出一行:

排序后的 n 个数字。

数字之间用一个空格隔开。


数据范围

1 ≤ n ≤ 100000

1 ≤ ai ≤ 10^18

保证所有数字均为正整数。


样例输入1

6
1 8 3 10 5 2

样例输出1

8 10 5 2 3 1

样例解释

每个数字的二进制表示:

数字 二进制 长度
1
2 10 2
3 11
5 101 3
8 1000 4
10 1010

按照规则:

第一步:二进制长度从大到小

长度4:
8 10

长度3:
5

长度2:
2 3

长度1:
1

第二步:相同长度按照数字升序

所以答案:

8 10 5 2 3 1

样例输入2

8
7 4 12 3 15 1 8 2

样例输出2

8 12 15 4 7 2 3 1