直接插入排序
排序算法思路:
- 在1~n-1范围维护一个下标end
- 将数组中下标为end的数与0~end-1的数进行比较
- 在2的基础上进行数据交换,从而实现升序(降序)排列
时间复杂度分析:
当带排序数组有序时为最优情况,最多需比较n-1次,交换0次;当带排序数组逆序时为最坏情况,最多需要比较n*(n-1)/2次,交换n*(n-1)/2次。
最好情况时间复杂度:O(n)
最坏情况时间复杂度:O(n^2)
稳定性分析:
一种稳定的排序算法
代码实现:
public class Code04_InsertSort {
//插入排序
public static void insertSort(int[] arr) {
//边界条件
if (arr == null || arr.length < 2) {
return;
}
int N = arr.length;
//描述一个结尾
for (int end = 1; end < N; end++) {
for (int j = end; j > 0; j--) {
swap(arr, j - 1, j);
}
}
}
public static void swap(int[] arr, int i, int j) {
int temp = 0;
if (arr[i] > arr[j]) {
temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
public static void printArray(int[] arr) {
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
System.out.println();
}
public static void main(String[] args) {
int[] arr = {7, 1, 3, 5, 1, 6, 8, 1, 3, 5, 7, 5, 6};
printArray(arr);
insertSort(arr);
printArray(arr);
}
}