故事引入
小竞在玩扑克牌,她习惯把手里的牌按从小到大整理。每次摸到一张新牌,她就从右向左比较已有的牌,找到合适的位置插入进去。这样,手里的牌始终是有序的。
现在请你模拟小竞的整理过程,并记录每一步“插入了什么数字、插到了哪个位置”。
题目描述
输入 n 个整数,使用插入排序将它们按从小到大(升序)排序。
要求:
- 每一轮(从第2个元素开始,到最后一个元素结束)都要输出当前要插入的数字以及它插入到已排序部分中的哪个位置(位置下标从1开始)。
- 输出本轮结束后整个数组的状态。
- 最后输出排序后的完整数组。
输入格式
第一行一个整数 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应该插入的位置。 - 插入完成后,输出当前数组的所有元素。