{ }codelper
交换值不换行输出P0133

运行排序网络

排序网络是一种按固定顺序每次比较并交换两个位置的装置。
第一行给出数的个数 n,第二行从左到右给出 n 个数。
从左起称为第 1、第 2、…、第 n 个位置。
第三行给出比较器的个数 m,接下来 m 行每行用位置编号 i, j(i < j)给出一个比较器。
按给定顺序逐个使用比较器。
如果第 i 个位置的数大于第 j 个位置的数,就交换这两个数;否则(相等时也一样)保持不变。
第一行对每个比较器输出一个字符,交换了输出 "x",没有交换输出 ".",中间不加空格,共 m 个字符。
第二行从左到右输出用完所有比较器后的数,用一个空格分开。
第三行,如果这些数从左到右不减小(相等的值可以相邻),输出 "已排序",否则输出 "未排序"。

输入
2 ≤ n ≤ 100,数是 -1,000,000,000 到 1,000,000,000 的整数,1 ≤ m ≤ 1,000,1 ≤ i < j ≤ n
输出
三行:m 个字符的 x/.
记录、最后的数、"已排序" 或 "未排序"
样例 1 · stdin
4
3 1 3 2
5
1 2
3 4
1 3
2 4
2 3
stdout
xx..x
1 2 3 3
已排序
样例 2 · stdin
3
2 1 0
2
1 2
2 3
stdout
xx
1 0 2
未排序
main.py
输入(stdin)

运行时这些行会依次作为 input()/标准输入传入(运行中不会等待输入)。

$ 就绪

请在电脑上打开以编写和运行代码。在手机上可以查看题目和题解。

其他语言怎么写?查看各语言题解 · 8 种语言题解

交换两个值的写法因语言而异。
Python a[i], a[j] = a[j], a[i],JS/TS [a[i], a[j]] = [a[j], a[i]](解构),C# (a[i], a[j]) = (a[j], a[i])(元组),C++ std::swap(a[i], a[j])。
Java、C、Craykon 没有这样的一行写法,要像 t = a[i]; a[i] = a[j]; a[j] = t; 这样用临时变量。
不用临时变量写成 a[i] = a[j]; a[j] = a[i];,第一句就把原来的 a[i] 覆盖掉,两个位置变成同一个值。
比较必须用 >。
用 >= 会把相等的值也交换,最后的数看起来一样,但记录里会多出 x。
不换行输出:Python print(c, end=""),JS/TS process.stdout.write(c)(console.log 总会换行),Java System.out.print(不同于 println),C# Console.Write(不同于 WriteLine),C putchar 或 printf("%c"),C++ std::cout << c(不加 std::endl),Craykon 控制台.接着输出(控制台.输出 会换行)。
接着输出之后,要自己写一次换行结束这一行,第二行才会另起一行(Python print(),Craykon 控制台.输出(""))。

Pythonmain.py · 15 行
n = int(input())a = list(map(int, input().split()))m = int(input())for _ in range(m):    i, j = map(int, input().split())    i -= 1    j -= 1    if a[i] > a[j]:        a[i], a[j] = a[j], a[i]  # 튜플로 한 번에 맞바꾼다        print("x", end="")  # end=""라야 줄을 바꾸지 않는다    else:        print(".", end="")print()  # 표시 줄을 끝낸다print(*a)print("已排序" if all(a[k] <= a[k + 1] for k in range(n - 1)) else "未排序")
JavaScriptmain.js · 18 行
const lines = require("fs").readFileSync(0, "utf8").split("\n");const n = Number(lines[0]);const a = lines[1].trim().split(/\s+/).map(Number);const m = Number(lines[2]);for (let k = 0; k < m; k++) {  const [i, j] = lines[3 + k].trim().split(/\s+/).map((v) => Number(v) - 1);  if (a[i] > a[j]) {    [a[i], a[j]] = [a[j], a[i]]; // 구조 분해로 맞바꾼다    process.stdout.write("x"); // console.log와 달리 줄을 바꾸지 않는다  } else {    process.stdout.write(".");  }}process.stdout.write("\n");let sorted = true;for (let k = 0; k + 1 < n; k++) if (a[k] > a[k + 1]) sorted = false;console.log(a.join(" "));console.log(sorted ? "已排序" : "未排序");
TypeScriptmain.ts · 19 行
import { readFileSync } from "node:fs";const lines: string[] = readFileSync(0, "utf8").split("\n");const n = Number(lines[0]);const a: number[] = lines[1].trim().split(/\s+/).map(Number);const m = Number(lines[2]);for (let k = 0; k < m; k++) {  const [i, j] = lines[3 + k].trim().split(/\s+/).map((v) => Number(v) - 1);  if (a[i] > a[j]) {    [a[i], a[j]] = [a[j], a[i]]; // 구조 분해로 맞바꾼다    process.stdout.write("x"); // console.log와 달리 줄을 바꾸지 않는다  } else {    process.stdout.write(".");  }}process.stdout.write("\n");let sorted = true;for (let k = 0; k + 1 < n; k++) if (a[k] > a[k + 1]) sorted = false;console.log(a.join(" "));console.log(sorted ? "已排序" : "未排序");
JavaMain.java · 39 行
import java.io.BufferedReader;import java.io.InputStreamReader;import java.io.PrintWriter;import java.util.StringTokenizer; public class Main {    public static void main(String[] args) throws Exception {        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));        PrintWriter out = new PrintWriter(System.out);        int n = Integer.parseInt(in.readLine().trim());        int[] a = new int[n];        StringTokenizer st = new StringTokenizer(in.readLine());        for (int k = 0; k < n; k++) a[k] = Integer.parseInt(st.nextToken());        int m = Integer.parseInt(in.readLine().trim());        for (int k = 0; k < m; k++) {            st = new StringTokenizer(in.readLine());            int i = Integer.parseInt(st.nextToken()) - 1, j = Integer.parseInt(st.nextToken()) - 1;            if (a[i] > a[j]) {                int t = a[i]; // 임시 변수에 하나를 맡겨 두고 맞바꾼다                a[i] = a[j];                a[j] = t;                out.print('x'); // print는 줄을 바꾸지 않는다(println은 바꾼다)            } else {                out.print('.');            }        }        out.println();        boolean sorted = true;        StringBuilder row = new StringBuilder();        for (int k = 0; k < n; k++) {            if (k > 0) row.append(' ');            row.append(a[k]);            if (k + 1 < n && a[k] > a[k + 1]) sorted = false;        }        out.println(row);        out.println(sorted ? "已排序" : "未排序");        out.flush();    }}
C#Main.cs · 31 行
using System;using System.Linq; class Program{    static void Main()    {        int n = int.Parse(Console.ReadLine());        int[] a = Console.ReadLine().Split(' ', StringSplitOptions.RemoveEmptyEntries).Select(int.Parse).ToArray();        int m = int.Parse(Console.ReadLine());        for (int k = 0; k < m; k++)        {            int[] ij = Console.ReadLine().Split(' ', StringSplitOptions.RemoveEmptyEntries).Select(int.Parse).ToArray();            int i = ij[0] - 1, j = ij[1] - 1;            if (a[i] > a[j])            {                (a[i], a[j]) = (a[j], a[i]); // 튜플로 맞바꾼다                Console.Write('x'); // Write는 줄을 바꾸지 않는다(WriteLine은 바꾼다)            }            else            {                Console.Write('.');            }        }        Console.WriteLine();        bool sorted = true;        for (int k = 0; k + 1 < n; k++) if (a[k] > a[k + 1]) sorted = false;        Console.WriteLine(string.Join(" ", a));        Console.WriteLine(sorted ? "已排序" : "未排序");    }}
C++main.cpp · 25 行
#include <algorithm>#include <iostream>#include <utility>#include <vector> int main() {    int n, m;    std::cin >> n;    std::vector<int> a(n);    for (int& v : a) std::cin >> v;    std::cin >> m;    for (int k = 0; k < m; k++) {        int i, j;        std::cin >> i >> j;        if (a[i - 1] > a[j - 1]) {            std::swap(a[i - 1], a[j - 1]); // 표준 라이브러리가 맞바꿔 준다            std::cout << 'x'; // endl이나 '\n'을 붙이지 않으면 줄이 이어진다        } else {            std::cout << '.';        }    }    std::cout << '\n';    for (int k = 0; k < n; k++) std::cout << (k ? " " : "") << a[k];    std::cout << '\n' << (std::is_sorted(a.begin(), a.end()) ? "已排序" : "未排序") << '\n';}
Cmain.c · 32 行
#include <stdbool.h>#include <stdio.h> int main(void) {    int n, m;    int a[100];    scanf("%d", &n);    for (int k = 0; k < n; k++) scanf("%d", &a[k]);    scanf("%d", &m);    for (int k = 0; k < m; k++) {        int i, j;        scanf("%d %d", &i, &j);        i--;        j--;        if (a[i] > a[j]) {            int t = a[i]; /* 임시 변수에 하나를 맡겨 두고 맞바꾼다 */            a[i] = a[j];            a[j] = t;            putchar('x'); /* 글자 하나만, 줄바꿈 없이 */        } else {            putchar('.');        }    }    putchar('\n');    bool sorted = true;    for (int k = 0; k < n; k++) {        printf(k ? " %d" : "%d", a[k]);        if (k + 1 < n && a[k] > a[k + 1]) sorted = false;    }    printf("\n%s\n", sorted ? "已排序" : "未排序");    return 0;}
Craykonmain.cray · 31 行
n = 控制台.读行().转数字();a = 控制台.读数字();m = 控制台.读行().转数字();循环 (k = 0; k < m; k++){    ij = 控制台.读数字();    i = ij[0] - 1;    j = ij[1] - 1;    如果 (a[i] > a[j])    {        t = a[i]; // 임시 변수에 하나를 맡겨 두고 맞바꾼다        a[i] = a[j];        a[j] = t;        控制台.接着输出("x"); // 이어쓰기는 줄을 바꾸지 않는다    }    否则    {        控制台.接着输出(".");    }}控制台.输出(""); // 표시 줄을 끝낸다정렬됨 = 真;循环 (k = 0; k + 1 < n; k++){    如果 (a[k] > a[k + 1])    {        정렬됨 = 假;    }}控制台.输出(a);控制台.输出(정렬됨 ? "已排序" : "未排序");