直接插入排序
直接插入排序的思想是将一个数据插入到已经排好的有序表当中,得到一个新的有序表。步骤如下:
(1)将数组第一个数arr[0]作为已知有序表;
(2)若第二个数比第一个数大,插入到arr[0]的左边,否则插入到右边,从而得到新的有序表;
(3)往后依次进行,直到最后一个数放到适当的位置
public class StraightInsertionSort {
public static void main(String[] args) {
int[] arr = {15,58,42,12,1,47,65,6,89,56};
straightInsertionSort(arr);
}
private static void straightInsertionSort(int[] arr) {
int temp;//用于记录要插入的数据(即当前遍历到的数据)
int j;
for (int i = 1; i < arr.length; i++) {//将i=0的数据当做已知有序表,从i=1开始遍历
temp = arr[i];
for(j = i-1;j>=0 && arr[j]>temp;j--){//遍历i之前的数据,直到不大于arr[i]为止
arr[j+1] = arr[j];//较大的数全部后移一位
}
arr[j+1] = temp;//将要插入的数插入到相应位置
}
}
}
时间复杂度分析:
- 最好情况下,数组本身就是有序的,这样只需要比较n-1次,移动数据0次,时间复杂度为$O(n)$
- 最差情况下,待排序表是逆序的,比较次数是$\sum_{i=1}^{n-1}i=\frac{n(n-1)}{2}$,移动次数为$\sum_{i=1}^{n-1}i=\frac{n(n-1)}{2}$,所以时间复杂度为$O(n^2)$。
- 根据概率相同原则,平均时间复杂度为$O(n^2)$