一个很好的书.<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成立
则所有都成立.
希尔排序的代码
- public static <AnyTypeentends Comparable<? super AnyType>>
- void shellsort(AnyType [ ]a )
- {
- int j=0;
- for(int gap=a.length/2;gap>0;)
- {gap=gap==2?1:(int)(gap/2.2);} //选取希尔增量.保证增量到1.为什么是2.2 作者也不知道
- for(int i=gap;i<a.length;i++)
- {
- AnyType tmp=a[i];
- j=i;
- for(;j>=gap&&tmp.compareTo(a[j-gap]<0);j-=gap )
- a[j]=a[j-gap]; //交换
- a[j]=tmp;
- }
- }
快速排序: //jdk里面系统排序就是这个排序.
快速排序最好情况利用了中间数是调和数的事实
挑选中心点是快速排序性能中至关重要的部分.千万不能以第一个为中心.选取中点为中心点是个合理但是消极的策略
选取策略:第一个元素.最后个元素.中点元素不大不小的那个放到为中心点.
快速排序推荐策略:
step1:交换中心点到最后的位置.
step2:从左到右运行i.从右到左运行j.遇到一个之前的大元素时i停.遇到一个小元素的时候j停.交换i j的值.值到i j相等停止
step3:位置i和最后的那个数交换(中心点)
书还了.还有个作业.如果排序的数各个都相等怎么办?好的算法必然这个也要考虑.通常做法是继续排序.或者改进优化.继续排序可能上面的i和j停不了.到了中点终止.呵呵.正好