題目描述
給定一個幾乎已排序好的陣列,這個陣列只有最後一個元素是還沒排序的。請使用插入排序法排序最後一個元素,並將過程輸出。
原題網址
輸入格式
輸入有兩行。第一行是陣列的大小,範圍在1到1000之間(包含1和1000)。第二行是陣列的所有元素,每個元素都是範圍-10000到10000(包含-10000到10000)的整數,使用空格隔開。
輸出格式
分行輸出排序時陣列元素每次位移的過程。
範例輸入
5
2 4 6 8 3
2 4 6 8 3
範例輸出
2 4 6 8 8
2 4 6 6 8
2 4 4 6 8
2 3 4 6 8
2 4 6 6 8
2 4 4 6 8
2 3 4 6 8
額外解釋
有關於插入排序法的介紹可以參考以下這篇文章:
根據插入排序法,要從陣列最後一個元素之前找出比最後一個元素「3」還要小,或是相等的元素,並將最後一個元素「3」插入至這找到的元素之後。在尋找這個元素的過程中,會將找過的元素往右移。也就是說,一開始先判斷「8」是否有比「3」還要小,因為沒有,所以將「8」往右移,原本的「3」的位置會被取代成「8」。接著判斷「6」是否有比「3」還要小,因為沒有,所以將「6」往右移,原本的「8」的位置會被取代成「6」。接著判斷「4」是否有比「3」還要小,因為沒有,所以將「4」往右移,原本的「6」的位置會被取代成「4」。接著判斷「2」是否有比「3」還要小,因為有,所以用「3」取代掉「2」的右邊元素「4」,就完成插入排序了。
解題概念
先記下原本陣列最後一個元素的值。利用for迴圈從陣列倒數第二個元素開始往前(左)尋找比原本最後一個元素還要小,或是相等的元素。如果該次沒有找到,就把該次尋找索引位置的元素內容複製到其右邊的索引位置,完成右移。接著再繼續往前尋找,如果有找到這樣的元素,就直接跳出迴圈,將原本最後一個元素的值複製到找到的索引位置的下一個索引位置,完成插入。如果都沒有找到這樣的元素,則直接把原本最後一個元素的值複製到陣列索引0的位置。
參考答案
import java.util.Scanner;
public class Solution {
public static void main(final String[] args) {
Scanner in = new Scanner(System.in);
int s = in.nextInt();
int[] ar = new int[s];
for (int i = 0; i < s; i++) {
ar[i] = in.nextInt();
}
insertIntoSorted(ar);
}
private static void printArray(int[] ar) {
for (int n : ar) {
System.out.print(n + " ");
}
System.out.println("");
}
public static void insertIntoSorted(int[] ar) {
final int n = ar[ar.length - 1];
int j = ar.length - 2;
for (; j >= 0; --j) {
if (n < ar[j]) {
ar[j + 1] = ar[j];
printArray(ar);
} else {
break;
}
}
ar[j + 1] = n;
printArray(ar);
}
}