插入排序
public class InsertSort {
public static void main(String[] args) {
int[] arr = new int[10];
Random random = new Random();
for(int i = 0; i < 10; i++) {
arr[i] = random.nextInt(10);
}
Arrays.stream(arr).forEach(System.out::print);
insertSort(arr);
System.out.println("");
Arrays.stream(arr).forEach(System.out::print);
}
public static void insertSort(int[] arr) {
int length = arr.length;
int index;
int item;
for(int i = 1; i < length; i++) {
index = i - 1;
item = arr[i];
while(index >= 0 && item < arr[index]) {
arr[index + 1] = arr[index];
index--;
}
arr[index + 1] = item;
}
}
}
性能分析
- 空間複雜度爲O(1)。
- 在插入排序中,對於值相同的元素,可以選擇將後面出現的元素,插入到前面出現元素的後面,這樣就可以保持原有的前後順序不變,所以插入排序是穩定的排序算法。
- 假設待排序的n個元素有序,則每次將第i個元素往前i-1個已經有序的元素中插入時,一次比較即可找到插入的位置,因此最好情況時間複雜度爲O(n);
假設待排序的n個元素逆序,則每次將第i個元素往前i-1個已經有序的元素中插入時,每次都需要遍歷完前i-1個元素才能找到插入位置,因此最壞情況時間複雜度爲O(n^2);
往有序數組中插入一個元素的平均時間複雜度爲O(n),所以,對於插入排序操作,每次將第i個元素插入到前i-1個元素中時,找插入的位置的時間複雜度爲O(i-1),所以平均時間複雜度爲O(n^2)。