排序算法之插入排序

来源:互联网 发布:禁用学校还原软件 编辑:程序博客网 时间:2024/06/06 02:54

插入排序是基于比较的排序。

对于这类排序,就有两种基本的操作:①比较操作; ②交换操作

其中,对于交换操作,可以优化成移动操作,即不直接进行两个元素的交换,还是用一个枢轴元素(tmp)将当前元素先保存起来,然后执行移动操作,待确定了最终位置后,再将当前元素放入合适的位置。(下面的插入排序就用到了这个技巧)--因为,交换操作需要三次赋值,而移动操作只需要一次赋值

步骤

  1. 从第一个元素开始,该元素可以认为已经被排序
  2. 取出下一个元素,在已经排序的元素序列中从后向前扫描
  3. 如果该元素(已排序)大于新元素,将该元素移到下一位置
  4. 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置
  5. 将新元素插入到该位置后
  6. 重复步骤2~5


下面是以Java以从小到大的整型数组排序代码:

  public int[] InsertSort(int[] arg){        for(int i=1;i<arg.length;i++){            int temp = arg[i];  //保存当前位置i的元素,其中[0,i-1]已经有序            int j=i;    while(j>0&&arg[j-1]>temp){//i位置的元素与前面的[0,i-1]的元素进行比较,然后插入到适当位置arg[j]=arg[j-1]; j--;}            arg[j]=temp;        }        return arg;    }



复杂度分析

 ①插入排序的时间复杂度 就是判断比较次数有多少,而比较次数与 待排数组的初始顺序有关,当待排数组有序时,没有移动操作,此时复杂度为O(N),当待排数组是逆序时,比较次数达到最大--对于下标 i 处的元素,需要比较 i-1 次。总的比较次数:1+2+...+N-1 ,故时间复杂度为O(N^2)

①可以看出,算法中只用到了一个临时变量,故空间复杂度为O(1)


参考:http://www.cnblogs.com/jackbase/p/4277335.html

http://www.cnblogs.com/hapjin/p/5517667.html

0 0
原创粉丝点击