程序设计 -- 01串排序

将 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;
}