算法描述
插入排序,一般也被称为直接插入排序。对于少量元素的排序,它是一个有效的算法 。
插入排序是指在待排序的元素中,假设前面n-1(其中n>=2)个数已经是排好顺序的,现将第n个数插到前面已经排好的序列中,然后找到合适自己的位置,使得插入第n个数的这个序列也是排好顺序的。按照此法对所有元素进行插入,直到整个序列排为有序的过程,称为插入排序。
图解
参考代码
public class InsertSort {
public static void main(String[] args) {
int[] arr = new int[20];
Random random = new Random();
for (int i = 0; i < arr.length; i++) {
arr[i] = random.nextInt(50);
}
insertSort(arr);
System.out.println(Arrays.toString(arr));
}
//插入排序
private static void insertSort(int[] arr) {
for (int i = 1; i < arr.length; i++) {
for (int j=i;j > 0 && arr[j-1]>arr[j];j--) {//前面有元素且当前元素小于前面元素
exchange(arr,j,j-1);
}
}
}
static void exchange(int[] arr, int i, int j) {
int tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
}
public class InsertSort {
public static void main(String[] args) {
int[] arr = new int[20];
Random random = new Random();
for (int i = 0; i < arr.length; i++) {
arr[i] = random.nextInt(50);
}
insertSortUpper(arr);
System.out.println(Arrays.toString(arr));
}
//优化的插入排序
private static void insertSortUpper(int[] arr) {
int temp = 0;//存放需要交换的元素
int j = 0;
for (int i = 1; i < arr.length; i++) {
temp = arr[i];
for (j = i; j > 0 && arr[j - 1] > temp; j--) {//前面有元素且比temp大
arr[j] = arr[j - 1];
}
arr[j] = temp;
}
}
}
算法性能
-
时间复杂度
O(n^2)
-
空间复杂度
O(1)
-
算法稳定性
稳定