插入排序是对于基本有序数组最好用的排序算法。
1.核心思想
从第2个数开始,依次和前面的所有数比较,如果大于前数,则插入到它前面(所谓插入就是依次和前数换位,见下面step3)。
假设有数组:3 5 4 6 2
step1: 从第二个数5开始,依次与前数比较,5大于3,则5插到3前面:
初始:3 5 4 6 2
//5>3,换:
5 3 4 6 2
step2: 从第3个数4开始,依次与前数比较,4大于3, 则4插到3前面:
初始: 5 3 4 6 2
// 4>3,换:
5 4 3 6 2
// 4<5,不换:
5 4 3 6 2
step3: 从第四个数6开始,依次与前数比较,大于3 4 5,则6插到5前面:
初始:5 4 3 6 2
//6>3,换:
5 4 6 3 2
//6>4,换:
5 6 4 3 2
//6>5,换:
6 5 4 3 2
step4: 从第五个数2开始,依次与前数比较,最小,故不变:
6 5 4 3 2
2.代码实现
先附上一个好用的在线Java编译工具:https://www.jdoodle.com/online-java-compiler/
import java.util.Arrays;
public class InsertionSort{
public static void main(String[] args){
int[] array = {3,1,9,4,2};
System.out.println("排序前:"+Arrays.toString(array));
sort(array);
}
public static void sort(int[] array){
for(int i =1 ; i <= array.length - 1 ; i++){
for(int j = i ; j > 0 ; j--){
if(array[j] >= array[j-1]){
changePosition(array, j , j-1);
System.out.println("排序后:"+Arrays.toString(array));
}
}
}
}
public static void changePosition(int[] array, int a , int b){
int temp = array[a];
array[a] = array[b];
array[b] = temp;
}
}
3.性能分析
时间复杂度:O(n²) ,n + n - 1 + n - 2 +…+2+1 = n(n-1)/2 = 0.5n² - 0.5n ≈ n²
空间复杂度:O(1)
稳定性:稳定,由于插入对象和被比较对象相等时,仍会插入到前面,所以是稳定的。
欢迎各位评论交流指点,您的每一分评论和关注都是对我的莫大鼓励!
如果对各位大佬有帮助,也请点个赞吧hhhh~