Shell排序和归并排序

转载http://blog.csdn.net/cjjky/article/details/7029141

希尔排序,也称递减增量排序算法,是插入排序的一种高速而稳定的改进版本。

希尔排序是基于插入排序的以下两点性质而提出改进方法的:

  • 插入排序在对几乎已经排好序的数据操作时, 效率高, 即可以达到线性排序的效率
  • 但插入排序一般来说是低效的, 因为插入排序每次只能将数据移动一位
步长的选择是希尔排序的重要部分。只要最终步长为1任何步长序列都可以工作。算法最开始以一定的步长进行排序。然后会继续以一定步长进行排序,最终算法以步长为1进行排序。当步长为1时,算法变为插入排序,这就保证了数据一定会被排序。
一直较好的增量序列是2^k-1,2^(k-1)-1,.....7,3,1,这样可使Shell排序时间复杂度达到O(N^1.5)。
为了方便扩展,先引入一个抽象的基础类:
[html] view plain copy
  1. packagecom.andyidea.algorithms;
  2. /**
  3. *排序抽象基础类
  4. *@authorAndy.Chen
  5. *
  6. *@param<T>
  7. */
  8. publicabstractclassSorter<TextendsComparable<T>>{
  9. publicabstractvoidsort(T[]array,intfrom,intlen);
  10. publicfinalvoidsort(T[]array){
  11. sort(array,0,array.length);
  12. }
  13. protectedfinalvoidswap(T[]array,intfrom,intto){
  14. Ttmp=array[from];
  15. array[from]=array[to];
  16. array[to]=tmp;
  17. }
  18. }
希尔(Shell)排序算法源码如下:
[html] view plain copy
  1. packagecom.andyidea.algorithms;
  2. /**
  3. *希尔(Shell)排序算法
  4. *@authorAdministrator
  5. *
  6. *@param<T>
  7. */
  8. publicclassShellSort<TextendsComparable<T>>extendsSorter<T>{
  9. @Override
  10. publicvoidsort(T[]array,intfrom,intlen){
  11. intvalue=1;
  12. while((value+1)*2<len){
  13. value=(value+1)*2-1;
  14. }
  15. for(intdelta=value;delta<=1;delta=(delta+1)/2-1){
  16. for(inti=0;i<delta;i++){
  17. invokeInsertionSort(array,from,len,delta);
  18. }
  19. }
  20. }
  21. privatefinalvoidinvokeInsertionSort(T[]array,intfrom,intlen,intdelta){
  22. if(len<=1)
  23. return;
  24. Ttmp=null;
  25. for(inti=from+delta;i<from+len;i+=delta)
  26. {
  27. tmp=array[i];
  28. intj=i;
  29. for(;j>from;j-=delta)
  30. {
  31. if(tmp.compareTo(array[j-delta])<0)
  32. {
  33. array[j]=array[j-delta];
  34. }
  35. elsebreak;
  36. }
  37. array[j]=tmp;
  38. }
  39. }
  40. }

归并排序,是建立在归并操作上的一种有效的排序算法。该算法是采用分治法的一个非常典型的应用。 也叫归并算法,指的是将两个已经排序的序列合并成一个序列的操作。归并排序算法依赖归并操作。

算法描述

归并操作的过程如下:

  1. 申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列
  2. 设定两个指针,最初位置分别为两个已经排序序列的起始位置
  3. 比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置
  4. 重复步骤3直到某一指针达到序列尾
  5. 将另一序列剩下的所有元素直接复制到合并序列尾
归并排序算法源码如下:
[html] view plain copy
  1. packagecom.andyidea.algorithms;
  2. importjava.lang.reflect.Array;
  3. /**
  4. *归并排序法
  5. *@authorAndy.Chen
  6. *
  7. *@param<T>
  8. */
  9. publicclassMergeSort<TextendsComparable<T>>extendsSorter<T>{
  10. @SuppressWarnings("unchecked")
  11. @Override
  12. publicvoidsort(T[]array,intfrom,intlen){
  13. if(len<=1)
  14. return;
  15. T[]temp=(T[])Array.newInstance(array[0].getClass(),len);
  16. mergeSort(array,from,from+len-1,temp);
  17. }
  18. /**
  19. *分成两组排序
  20. *@paramarray
  21. *@paramfrom
  22. *@paramto
  23. *@paramtemporary
  24. */
  25. privatefinalvoidmergeSort(T[]array,intfrom,intto,T[]temporary){
  26. if(to<=from)
  27. return;
  28. intmiddle=(from+to)/2;
  29. mergeSort(array,from,middle,temporary);
  30. mergeSort(array,middle+1,to,temporary);
  31. merge(array,from,to,middle,temporary);
  32. }
  33. /**
  34. *把排序好的序列合并
  35. *@paramarray
  36. *@paramfrom
  37. *@paramto
  38. *@parammiddle
  39. *@paramtemporary
  40. */
  41. privatefinalvoidmerge(T[]array,intfrom,intto,intmiddle,T[]temporary){
  42. intk=0;
  43. intleftIndex=0;
  44. intrightIndex=to-from;
  45. System.arraycopy(array,from,temporary,0,middle-from+1);
  46. for(inti=0;i<to-middle;i++){
  47. temporary[to-from-i]=array[middle+i+1];
  48. }
  49. while(k<to-from+1){
  50. if(temporary[leftIndex].compareTo(temporary[rightIndex])<0)
  51. {
  52. array[k+from]=temporary[leftIndex++];
  53. }
  54. else
  55. {
  56. array[k+from]=temporary[rightIndex--];
  57. }
  58. k++;
  59. }
  60. }
  61. }

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值