插入排序

来源:互联网 发布:厦门seo陈仁潘 编辑:程序博客网 时间:2024/06/05 10:34
  /*        * 原始数据    34  8  64  51  32  21       移动的位置       * p=1趟后       8  34  64  51  32  21           1       * p=2趟后       8  34  64  51  32  21           0       * p=3趟后       8  34  51  64  32  21           1       * p=4趟后       8  32  34  51  64  21           1       * p=5趟后       8  21  32  34  51  64           4        * */ /*插入排序有N-1趟排序组成,对于从p=0到p=N-1,插入排序保证从位置0到位置p上的元素为已排序状态。*/public static <AnyType extends Comparable<? super AnyType>>                              void insertionSort(AnyType[] a) { int j;for(int p=1;p<a.length;p++){AnyType tmp  = a[p];for(j=p;j>0&&tmp.compareTo(a[j-1])<0;j--){a[j] = a[j-1];}a[j] = tmp;} } 
插入排序的分析由于嵌套循环每一次都花费N次迭代,因此插入排序为O(N2),如返序输入可以达到这个境界,对于循环中的元素的比较次数对于p每个值最多是p+1次,对所有p求和可得到另一方面,如果输入数据已经预先排序,那么运行时间为O(N),因为内层循环是立即判定不成立而终止,事实上,如果输入几乎是被排序,那么插入排序将运行的很快,实际上,插入排序的平均情形时Θ(N2)

逆序是指具有性质i<j但a[i]>a[j]的序偶(a[i],a[j]).34,8,64,51,32,21有九个序偶(34,8),(34,32),(34,21),(64,51),(64,32),(64,21),(51,32),(51,21),(32,21)注意,这正好是需啊哟插入排序执行的交换次数,因为交换两个不安顺序排列的相邻元素恰好消除一个逆序,而一个排过序的数组没有逆序,由于算法还有O(N)量的其他工作,因此插入排序的时间是O(I+N),I是原始数组中的逆序数 定理一:N个互异数的数组的平均逆序数是N(N-1)/4         证明方法,N个互异数的数组和它的反序数组的总共逆序数是N(N-1)/2,因此平均是N(N-1)/4,这个定理意味着插入排序平均是二次的,同时也提供了只交换相邻元素的任何算法的一个下界。 定理二:通过交换相邻元素进行排序的任何算法平均都只需要Ω(N2)        N(N-1)/4=Ω(N2)










0 0
原创粉丝点击