package Sort;
/**
* 最坏情况:当待排序序列为逆序状态,首先遍历整个序列,之后一个一个地将待插入元素放在已排好序的序列最前面,之后的所有元素都需要向后移动一位,时间复杂度为O(n^2)
* 最好情况:当待排序序列为正序状态,则遍历完整个序列,当插入元素时,只比较一次就够了,所以时间复杂度为O(n)
* 稳定性: 当待插入元素与有序序列中比较的元素相等时,将待插入元素直接插入在该相等元素的后面。所以,两个元素位置的前后顺序没有改变,故插入排序是稳定的
*/
/**
* 1.将第一个待排序的序列的第一个元素看做一个有序序列,把第二个元素到最后一个元素当成是未排序序列。
* 2.从头到尾一次扫描未排序的序列,将扫描到的每个元素插入有序序列的适当位置
* (在这里需要注意一个问题,如果在有序序列中有一个和待插入的元素相等,则将待插入的元素查到此元素的后面,这样方式的插入排序是稳定的。
* 如果插入到此元素的前面,那么此种方式的插入排序是不稳定的)
* */
public class InsertSort {
public static void main(String[] args) {
int[] arr = new int[]{18, 4, 69, 3, 10, 20, 87, 33};
insertSort(arr);
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
}
public static void insertSort(int[] arr) {
if (arr.length == 1 || arr == null) {
return;
}
for (int i = 1; i < arr.length; i++) {
for (int j= i; j > 0; j--) {
if (arr[j] < arr[j - 1]) {//符合条件,插入元素(交换位置)
int temp = arr[j];
arr[j] = arr[j - 1];
arr[j - 1] = temp;
}
}
}
}
}