走进数据结构之排序(一)---直接插入排序

一、直接插入排序算法分析

直接插入排序是假定前i个构成的子序列是处于已排序的情况下进行排序的,然后将第i个元素与前i个构成的子序列逆序进行比较,如果是要升序排序,则比较第i个元素是否比j=i-1(i-1需要>=0)的元素大,如果是则第i个元素的位置(即j+1的位置上)保持不动,反之则将j=i-1的元素放置到i的位置,再进行第i个元素与j=i-2(i-2需要>=0)的,依次进行,如果第i个元素刚好比j=i-3大,则将第i个元素插入到j=i-2(即j+1的位置)上!

二、代码实现

package top.einino.insertionsort;

public class StraightInsertionSort {

//直接插入排序,升序排序
public static void insertSortAsc(int[] keys){
    for(int i=1;i
            int temp = keys[i],j;//从数组的第二个开始进行插入排序
            for(j=i-1; j>=0 && temp
                keys[j+1] = keys[j];//将已经排好序的子序列逆序与temp相比,比temp大,就将位置空出来,自己往后移!
            }
            keys[j+1] = temp;
System.out.print("第"+i+"趟temp="+temp+"\t");
print(keys);
}
}
//直接插入排序,降序排序
public static void insertSortDesc(int[] keys){
     for(int i=1; i
            int temp = keys[i], j;
            for(j=i-1; j>=0 && temp>keys[j];j--){
                keys[j+1] = keys[j];
            }
            keys[j+1] = temp;
System.out.print("第"+i+"趟temp="+temp+"\t");
print(keys);
}
}
//输出排序数组
private static void print(int[] keys) {
for(int key : keys){
System.out.print(key+" ");
}
System.out.println();
}

public static void main(String[] args) {
int[] keys = {32, 26, 87, 72, 26, 17};
//测试直接排序升序
StraightInsertionSort.insertSortAsc(keys);
int[] keys2 = {32, 26, 87, 72, 26, 17};
//测试直接排序降序
StraightInsertionSort.insertSortDesc(keys2);
}

}

三、形象的小例子!

体育课上老师需要将队伍按身高进行升序排序,但学生们都不自觉,唯有老师自行排序,假设初始升高序列是A170,B165,C180,D177;

老师开始进行第一趟排序,首先老师把B学生给拉出队伍,让他跟学生A比较,结果B

老师开始进行第二趟排序,老师将C学生拉出队伍,让他与学生A进行比较,结果C>A,既然C学生都比A学生高了,那肯定比前面的B学生还要高了,所以老师没有进行接下来的比较,直接把A学生放回到原先的位置,此时队伍顺序是B165,A170,C180,D177

老师开始进行第三趟排序,老师将D学生拉出队伍,让他与学生C进行比较,结果DC,则老师将D同学放置到了C学生的位置上,结束他第三趟的排序,此时队伍顺序是B165,A170,D177,C180

四、直接插入排序算法的时间复杂度

排序算法的时间复杂度由算法执行中的元素比较次数和移动次数确定。

1、最好情况是:已经排好序的数据序列,比较次数为n-1,移动次数为2(n-1)(主要是引入了中间变量temp,每次比较都要移动2次),时间复杂度为O(n)

2、最坏情况是:一个反序的数据序列,比较次数为n*(n-1)/2,移动次数为(n-1)(n+4)/2,时间复杂度为O(n^2)

3、随机排序,比较次数为n^2/4,移动次数为n^2/4,时间复杂度为O(n^2)

总之,直接插入排序算法的时间效率是在O(n)到O(n^2)之间,数据序列的初始排列越接近有序,直接插入排序的时间效率越高。

五、直接插入排序算法的空间复杂度

直接插入排序算法中的temp占用一个存储单元,空间复杂度为O(1)

六、稳定性

在直接插入排序算法中,关键字相等的元素会相遇进行比较,算法不改变它们的原有次序,所以,直接插入排序算法是稳定的。

七、小结

本博文从直接插入排序算法分析,升序和降序代码实现,老师排队的例子讲演,时间复杂度的3种情况,空间复杂度以及稳定性介绍了直接插入排序的方方面面。

如果有疑问或者对该博文有何看法或建议或有问题的,欢迎评论,恳请指正!

你可能感兴趣的:(数据结构)