題目描述
插入排序法在排序未排序過的龐大陣列時,會需要很多時間。為了瞭解究竟是什麼原因所造成的,我們需要分析一下執行時間。輸入一個未排序的陣列,請輸出使用插入排序法將這個陣列排列好的話,會需要移動幾次元素。
原題網址
輸入格式
輸入有兩行,第一行為陣列的大小,範圍在1到1001之間(包含1和1001)。第二行為陣列的所有元素,用空格字元分隔,範圍在-10000到10000之間(包含-10000和10000)。
輸出格式
輸出使用插入排序法將這個陣列排列好的話,會需要移動幾次元素。
範例輸入
5
2 1 3 1 2
2 1 3 1 2
範例輸出
4
額外解釋
第一個「1」需要往左移動一次,此時陣列如下:
1 2 3 1 2
第二個「1」需要往左移動兩次,此時陣列如下:
1 1 2 3 2
最尾端的「2」需要往左移動一次,此時陣列如下:
1 1 2 2 3
所以元素總共移動4次。
解題概念
有關於插入排序法的介紹可以參考以下這篇文章:
在位移的時候,另外使用一個變數來記錄位移的次數,排序完成後輸出記下的位移次數。
參考答案
import java.util.*;
public class Solution {
public static void insertionSort(int[] A) {
int count = 0;
for (int i = 1; i < A.length; i++) {
int value = A[i];
int j = i - 1;
while (j >= 0 && A[j] > value) {
A[j + 1] = A[j];
j = j - 1;
++count;
}
A[j + 1] = value;
}
System.out.println(count);
}
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int[] ar = new int[n];
for (int i = 0; i < n; i++) {
ar[i] = in.nextInt();
}
insertionSort(ar);
}
}