P1177 插入排序-升序排列

暂无评定 传统题 GESP数组排序循环结构 上传者
时间限制1000ms
内存限制256MiB
通过 / 提交0/0

P1177插入排序-升序排列

暂无评定 传统题 GESP数组排序循环结构 上传者
时间限制1000ms
内存限制256MiB
通过 / 提交0/0

故事引入
小竞在玩扑克牌,她习惯把手里的牌按从小到大整理。每次摸到一张新牌,她就从右向左比较已有的牌,找到合适的位置插入进去。这样,手里的牌始终是有序的。
现在请你模拟小竞的整理过程,并记录每一步“插入了什么数字、插到了哪个位置”。


题目描述

输入 n 个整数,使用插入排序将它们按从小到大(升序)排序。
要求:

  1. 每一轮(从第2个元素开始,到最后一个元素结束)都要输出当前要插入的数字以及它插入到已排序部分中的哪个位置(位置下标从1开始)。
  2. 输出本轮结束后整个数组的状态。
  3. 最后输出排序后的完整数组。

输入格式

第一行一个整数 n(1 ≤ n ≤ 100)。
第二行 n 个整数,用空格隔开。

输出格式

  • 第一行输出初始数组:Initial: 后跟数组元素,空格隔开。
  • 接下来 n-1 行,每行表示一轮插入的过程:
    Round i: 插入 X 到位置 pos 然后空格,再输出本轮结束后的数组(用空格隔开)。
    其中 i 从 1 开始(代表第几轮插入),X 是当前插入的数字,pos 是插入后的下标位置。
  • 最后一行输出 Sorted array: 后跟最终排好序的数组。

注意:如果当前数字不需要移动(即它已经比已排序部分最后一个元素大),那么它插入的位置就是它原来的位置(即 pos = i,其中 i 是它的原始下标)。但为了方便,统一输出插入后的下标。


样例输入

5
5 3 8 1 2

样例输出

Initial: 5 3 8 1 2
Round 1: 插入 3 到位置 1 → 3 5 8 1 2
Round 2: 插入 8 到位置 3 → 3 5 8 1 2
Round 3: 插入 1 到位置 1 → 1 3 5 8 2
Round 4: 插入 2 到位置 2 → 1 2 3 5 8
Sorted array: 1 2 3 5 8

样例解释

  • 初始:[5, 3, 8, 1, 2](视第一个元素5为已排序)
  • 第1轮(i=1):取 3,与已排序部分 [5] 从右向左比,5>3,将5右移,最后把3插入到位置1 → 数组变为 [3,5,8,1,2]
  • 第2轮(i=2):取 8,与已排序部分 [3,5] 比,5<8,不需要移动,直接放在末尾(位置3) → 数组仍为 [3,5,8,1,2]
  • 第3轮(i=3):取 1,与已排序 [3,5,8] 比,依次将8、5、3右移,最后插入到位置1 → [1,3,5,8,2]
  • 第4轮(i=4):取 2,与已排序 [1,3,5,8] 比,8、5、3右移,2插入到位置2(1的后面) → [1,2,3,5,8]
  • 最终有序。

要求

  • 必须自己实现插入排序。
  • 必须输出每轮插入的数字、插入位置和排序后的数组。
  • 输出格式中的箭头 → 前后有空格(见样例)。

提示

  • 用一个变量 key 保存当前要插入的数字。
  • 用一个循环 j 从 i-1 开始向左移动,如果 arr[j] > key,就把 arr[j] 向右移一位(arr[j+1] = arr[j])。
  • 循环结束后,j+1 就是 key 应该插入的位置。
  • 插入完成后,输出当前数组的所有元素。