将 01 串首先按长度排序,长度相同时,按 1 的个数多少进行排序,1 的个数相同时再按 ASCII 码值排序(字典序)。
输入格式
第一行输入一个整数 n (1≤n≤100),表示字符串的个数。
输入数据中含有一些 01 串,01 串的长度不大于 256 个字符。
输出格式
重新排列 01 串的顺序,使得串按基本描述的方式排序,然后依次输出。
输入样例
6
10011111
00001101
1010101
1
0
1100
输出样例
0
1
1100
1010101
00001101
10011111
供参考
#include <iostream>
using namespace std;
typedef struct node
{
char ch[257];
int one, len;
} Node;
void swap(Node &a, Node &b)
{
Node tmp = a;
a = b;
b = tmp;
}
int main()
{
int n;
cin >> n;
Node *node = new Node[n];
for (int i = 0; i < n; i++)
{
node[i].one = 0;
node[i].len = 0;
char ch;
while ((ch = getchar()) != '\n' && node[i].len < 256)
{
node[i].ch[node[i].len] = ch;
if (ch == '1')
node[i].one++;
node[i].len++;
}
node[i].ch[node[i].len] = '\0';
}
for (int i = 0; i < n - 1; i++)
{
for (int j = i; j < n; j++)
{
if (node[i].len > node[j].len)
{
swap(node[i], node[j]);
}
else if (node[i].len == node[j].len)
{
if (node[i].one > node[j].one)
{
swap(node[i], node[j]);
}
else if (node[i].one == node[j].one)
{
int k = 0;
while (k < node[i].len)
{
if (node[i].ch[k] > node[j].ch[k])
{
swap(node[i], node[j]);
break;
}
k++;
}
}
}
}
}
for (int i = 0; i < n; i++)
{
cout << node[i].ch << endl;
}
return 0;
}