一、直接插入排序
直接插入排序的基本思想是:将一个记录插入到已排好序的有序表中,从而得到一个新的有序表。
设数组为a[0…n-1]。
1. 初始时,a[0]自成1个有序区,无序区为a[1..n-1]。令i=1
2. 将a[i]并入当前的有序区a[0…i-1]中形成a[0…i]的有序区间。
3. i++并重复第二步直到i==n-1。排序完成。
java实现
public void insertSort(int array[]) {
int i,j;
for(i=1;i<array.length;i++) {
//a[i]>a[i-1]表示a[0..i]是有序的,无需调整
//否则令j=i-1,temp=a[i]。然后一边将数据a[j]向后移动一边向前搜索,当有数据a[j]<a[i]时停止并将temp放到a[j + 1]处。
if(array[i]<array[i-1]) {
int temp=array[i];
for(j=i-1;j>=0&&array[j]>temp;j--) {
array[j+1]=array[j];
}
array[j+1]=temp;
}
}
//再对将a[j]插入到前面a[0…j-1]的有序区间所用的方法进行改写,用数据交换代替数据后移。
//如果a[j]前一个数据a[j-1] > a[j],就交换a[j]和a[j-1],再j--直到a[j-1] <= a[j]。
public static void insertSort2(int array[]) {
int i,j;
for(i=1;i<array.length;i++) {
for(j=i-1;j>=0&&array[j+1]<array[j];j--) {
int temp=array[j+1];
array[j+1]=array[j];
array[j]=temp;
}
}
}
复杂度分析:
对于n个记录的文件,要进行n-1趟排序。
各种状态下时间复杂度为:
空间复杂度为o(1)
是稳定的排序算法。