插入排序
1.插入排序规则
- 划分两个子序列,有序的和无序的;
- 从无序序列中取出一个元素,插入到有序序列(保证顺序)。扩大有序子序列,减小无序子序列;
- 重复以上步骤.
public static void insert(int[] a){
//i 代表待插入元素的索引,1个元素默认有序
for(int i = 1;i< a.length;i++){
int t = a[i];//代表插入的元素值
int j=i-1;//代表已排序子序列的元素索引
while(j>=0){
if(t<a[j]){
a[j+1] = a[j];
}else{
break;//退出循环,减少比较次数
}
j--;
}
a[j+1]=t;
}
}
2.优化方式
- 待插入元素进行比较时,遇到比自己小的元素,就代表找到了插入位置,无需进行后续比较;
- 插入时可以直接移动元素,而不是交换元素(有零时变量,一次交换,就移动了三次元素)。
3.比较(选择排序)
- 是稳定排序算法;
- 平均时间复杂度O( n 2 n^2 n2)
- 大部分情况下,性能略高于选择排序;
- 对有序数组最好能达到O(n),冒泡排序O(n)。
缺点: 若最值元素位于数组前列,需要经历多轮移动才能到正确位置。