排序算法--直接插入排序

来源:互联网 发布:na.windows.app.23787 编辑:程序博客网 时间:2024/06/06 23:16

一.算法描述

插入排序和选择排序一样,也是一种简单而又易于理解的排序算法。人们整理一副打乱了顺序的扑克牌的方法通常是先从牌堆里取出一张,然后再将其放入一个已经有序的序列中,我们可以将无序的数组a[n]想象成这样一副打乱了顺序的扑克牌。排序过程中,数组分为有序与无序两个部分,具体步骤如下:

  1. 先取出1个元素a[1],将其与a[0]比较大小并排序,当前的有序序列即为a[0]-a[1];
  2. 再从无序序列中取出1个元素,将其与当前有序序列的最后一位进行比较,如果比最后一位小的话再依次向小的方向比较,直到将其插入到合适的位置。在这个过程中如果遇到相同的元元素,则插入到该元素的后面;
  3. 循环第2步的操作,直到将所有元素插入到合适的位置。在这个过程中,如果该元素插入的位置是在已经有序的部分之内,则将比它大的部分全部向后移动一位。

直接插入排序


二.算法特性

1.时间复杂度

最好情况:O(n)

最坏情况:O(n²)

平均情况:O(n²)

在最好的情况下(即所有元素均已有序时),只需要对数组进行n-1次循环,此时的时间复杂度取决于数组的长度,所以时间复杂度为O(n)。
在最坏的情况下(即所有元素均为逆序时),需要对数组进行n(n-1)/2次循环,此时的时间复杂度为O(n²)。

2.空间复杂度

O(1)

插入排序只需要存储那个取出之后等待插入的元素,所以不论数组的长度如何,其所需要的额外空间都是不变的。

3.稳定性

稳定

由于在比较的时候,是从有序部分的右端开始比较,在遇到相同元素的时候直接将其放在这个相同元素的后边,所以插入排序是稳定的。


三.算法实现

//直接插入排序public void insertionSort(Object[] a) {    for(int i = 1; i < a.length; i ++) {        for(int j = i; j > 0 && a[j] < a[j - 1]; j --)             exch(a, j - 1, j); //交换a[j-1]与a[j]的位置    }}
原创粉丝点击