排序算法.希尔排序&快速排序

来源:互联网 发布:复古美颜相机软件 编辑:程序博客网 时间:2024/05/22 03:19

一个很好的书.<Java数据结构和问题求解>Mark Allen Weiss著.折腾了两个月.终于还了.学校不让解了.

最后看了排序的东西

 

平方性能是任何通过相邻交换算的所固有的.

希尔排序:

希尔排序的增量是插入排序的改进.       //类似高数的差分

N个不同数组的平均逆序数是N*(N-1)/4

希尔排序最坏情况是奇数位都是较小数.偶数位都是较大数.最后一次的复杂度平方

如果连续增量是互质的复杂度为O N^(5/4)

如果是除以2.2 复杂度是 O N^(7/6) 没有人知道为什么.这个是模拟的结果

希尔排序的希尔增量类似数学归纳法里面的

1,2,3,4,...n成立

假设n+1,n+2,n+3,n+4,...2n-1成立如果

2n+1,2n+2,2n+3,2n+4,...3n-1成立

所有都成立.

 希尔排序的代码

Code:
  1. public static <AnyTypeentends Comparable<? super AnyType>>   
  2. void shellsort(AnyType [  ]a )   
  3.  {   
  4. int j=0;   
  5.  for(int gap=a.length/2;gap>0;)   
  6.     {gap=gap==2?1:(int)(gap/2.2);}   //选取希尔增量.保证增量到1.为什么是2.2 作者也不知道  
  7.  for(int i=gap;i<a.length;i++)   
  8.     {   
  9.     AnyType tmp=a[i];   
  10.      j=i;   
  11.      for(;j>=gap&&tmp.compareTo(a[j-gap]<0);j-=gap    )   
  12.      a[j]=a[j-gap];    //交换
  13.      a[j]=tmp;   
  14.     }   
  15.  }  

 

 快速排序:   //jdk里面系统排序就是这个排序.

快速排序最好情况利用了中间数是调和数的事实

挑选中心点是快速排序性能中至关重要的部分.千万不能以第一个为中心.选取中点为中心点是个合理但是消极的策略

选取策略:第一个元素.最后个元素.中点元素不大不小的那个放到为中心点.

快速排序推荐策略:

step1:交换中心点到最后的位置.

step2:从左到右运行i.从右到左运行j.遇到一个之前的大元素时i停.遇到一个小元素的时候j停.交换i j的值.值到i j相等停止

step3:位置i和最后的那个数交换(中心点)

 

书还了.还有个作业.如果排序的数各个都相等怎么办?好的算法必然这个也要考虑.通常做法是继续排序.或者改进优化.继续排序可能上面的i和j停不了.到了中点终止.呵呵.正好