1.直接插入排序
概述
插入排序(Insertion-Sort)的算法描述是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。
算法思想
从第二个元素开始,每次从这个元素之前的所有元素当中找出比这个元素小的地方,然后让这一个位置的后面元素都后移,最后这个元素的后面一个位置就是这个元素应该插入的位置。
图画演示
代码实现
public static void main(String[] args) {
int [] num= {10,5,20,30,15,50,40,60};
int i,j,temp;
for(i=1;i<num.length;i++) {
temp=num[i];
for(j=i-1;j>=0;j--) {
if(temp>num[j]) {
break;
}else
{
num[j+1]=num[j];
}
}
num[j+1]=temp;
}
for(i=0;i<num.length;i++) {
System.out.print(num[i]+" ");
}
}
时间复杂度
从代码中可以看出一共遍历了n-1 + n-2 + … + 2 + 1 = n * (n-1) / 2 = 0.5 * n ^ 2 - 0.5 * n,那么时间复杂度是O(N^2)。
最坏情况:O(n*n) 最好情况O(n) 平均情况O(n *n)
稳定性
因为在有序部分元素和待插入元素相等的时候,可以将待插入的元素放在前面,所以插入排序是稳定的。
2.折半插入排序
算法思想:
就是把直接插入排序中的查找插入位置时的操作改为折半查找方式
图解:
实现代码:
public static void main(String[] args) {
int [] num= {10,5,20,30,15,50,40,60};
int i,j,temp = 0,m,high=0,low;
for(i=1;i<num.length;i++) {
temp=num[i];
low=0;
high=i+1;
while(low<=high) {
m=(low+high)/2;
if(num[m]>temp) {
high=m-1;
}
else {
low=m+1;
}
}
}
for(j=i-1;j>=high+1;j--) {
num[j+1]=num[j];
}
num[j+1]=temp;
for(i=0;i<num.length;i++) {
System.out.print(num[i]+" ");
}
}
eclipse提示数组越界,没看懂,,我感觉没有越界..
时间复杂度
在不是很理想的情况下,折半插入排序算法比直接插入排序算法明显减少了关键字之间比较的次数,因此速度比直接插入排序算法快,但记录移动的次数没有变,所以折半插入排序算法的时间复杂度仍然为O(n2)。
稳定性
折半插入排序算法是一种稳定的排序算法。