必威体育Betway必威体育官网
当前位置:首页 > IT技术

希尔排序

时间:2019-08-11 10:10:00来源:IT技术作者:seo实验室小编阅读:74次「手机版」
 

希尔排序

希尔排序又称缩小增量排序,是1959年由D.L.Shell提出来的。先取定一个小于n的整数gap1作为第一个增量,把整个序列分成gap1组。所有距离为gap1的倍数的元素放在同一组中,在各组内分别进行排序(分组内采用直接插入排序或其它基本方式的排序)。 然后取第二个增量gap2<gap1,重复上述的分组和排序。 依此类推,直至增量gap=1,即所有元素放在同一组中进行排序为止。

开始时 gap 的值较大, 子序列中的元素较少, 排序速度较快。 随着排序进展, gap 值逐渐变小, 子序列中元素个数逐渐变多,由于前面大多数元素已基本有序, 所以排序速度仍然很快。 分组后n值减小,n²更小,而T(n)=O(n²),所以T(n)从总体上看是减小了。 Gap的取法有多种。 shell 提出取 gap = n/2 ,gap = gap/2 ,…,直到gap = 1。gap若是奇,则gap=gap+1

//////////////希尔排序////////////////

   @Test

   public void shellSort( ){

       int a[] = new int[]{1,3,21,0,25,49,25,16,8,23,45,-3,4};

       

       for(int gap=(a.length+1)/2; ; ){ //分组

           //用越有序越有利的排序算法(基本排序算法)进行组内排序

           //为便于大家理解shell排序算法,这里用冒泡进行组内排序

           for(int i=0;i<a.length-gap;i++){//AC

           //for(int i=0;i<gap;i++){//WA

               for(int j=i;j<a.length-gap;j+=gap){

                   if(a[j]>a[j+gap]){

                       swap(a,j,j+gap);

                   }

               }

           }

           

           

           if(gap>1){

               gap=(gap+1)/2;

           }else{

               break;

           }

       }

       

       print(a);

   }

相关阅读

分享到:

栏目导航

推荐阅读

热门阅读