插入排序
从数组的第二个位置开始依次拿出一个值与前一个值比较,如果比前面的小,就和它交换位置。
public class InsertionSort {
public static void main(String[] args) {
// int[] arr = {9, 6, 1, 3, 5};
int[] arr = {1, 2, 3, 4, 5};
sort(arr);
}
public static void sort(int[] arr) {
// 记录比较次数
int num = 0;
// 记录交换次数
int swapNum = 0;
for (int i = 1; i < arr.length; i++) {
for (int j = i; j > 0; j--) {
num++;
if (arr[j] < arr[j - 1]) {
swap(arr, j, j - 1);
swapNum ++;
} else {
break;
}
}
}
print(arr);
System.out.println("比较"+(num)+"次");
System.out.println("交换"+(swapNum)+"次");
}
/**
* 交换元素位置
* @param arr 数组
* @param i 位置1
* @param j 位置2
*/
static void swap(int[] arr, int i, int j) {
// 记录原最小值,用于和最小值互换
int temp = arr[i];
// 数组中原最小值换为新的最小值
arr[i] = arr[j];
// 最小值的位置换为原最小值
arr[j] = temp;
}
static void print(int arr[]) {
Arrays.stream(arr).forEach(num->{
System.out.print(num + " ");
});
System.out.println();
}
}
其实它和冒泡排序有点像,只不过它在移动的时候遇到比自己小的就停了,它最差循环的次数为 n ( n − 1 ) 2 \frac{n(n-1)}{2} 2n(n−1),当n趋于无限大的时候,它的时间复杂度为 O ( n 2 ) O(n^2) O(n2),最好的情况数组是有序的,那么它的内层循环只执行了1次,所以时间复杂度为 O ( n ) O(n) O(n),那么这种写法有优化的空间吗?也有,不用交换的方式,用临时变量替代。