希尔排序

JAVA

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
public  static  void  main(String [] args)
{
     int []a={ 49 , 38 , 65 , 97 , 76 , 13 , 27 , 49 , 78 , 34 , 12 , 64 , 1 };
         System.out.println( "排序之前:" );
         for ( int  i= 0 ;i<a.length;i++)
         {
             System.out.print(a[i]+ " " );
         }
         //希尔排序
         int  d=a.length;
             while ( true )
             {
                 d=d/ 2 ;
                 for ( int  x= 0 ;x<d;x++)
                 {
                     for ( int  i=x+d;i<a.length;i=i+d)
                     {
                         int  temp=a[i];
                         int  j;
                         for (j=i-d;j>= 0 &&a[j]>temp;j=j-d)
                         {
                             a[j+d]=a[j];
                         }
                         a[j+d]=temp;
                     }
                 }
                 if (d== 1 )
                 {
                     break ;
                 }
             }
             System.out.println();
             System.out.println( "排序之后:" );
                 for ( int  i= 0 ;i<a.length;i++)
                 {
                     System.out.print(a[i]+ " " );
                 }
     }

C语言

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include<stdio.h>
#include<math.h>
 
#define MAXNUM 10
 
void  main()
{
     void  shellSort( int  array[], int  n, int  t); //t为排序趟数
     int  array[MAXNUM],i;
     for (i=0;i<MAXNUM;i++)
         scanf ( "%d" ,&array[i]);
     shellSort(array,MAXNUM, int ( log (MAXNUM+1)/ log (2))); //排序趟数应为log2(n+1)的整数部分
     for (i=0;i<MAXNUM;i++)
         printf ( "%d " ,array[i]);
     printf ( "\n" );
}
 
//根据当前增量进行插入排序
void  shellInsert( int  array[], int  n, int  dk)
{
     int  i,j,temp;
     for (i=dk;i<n;i++) //分别向每组的有序区域插入
     {
         temp=array[i];
         for (j=i-dk;(j>=i%dk)&&array[j]>temp;j-=dk) //比较与记录后移同时进行
             array[j+dk]=array[j];
         if (j!=i-dk)
             array[j+dk]=temp; //插入
     }
}
 
//计算Hibbard增量
int  dkHibbard( int  t, int  k)
{
     return  int ( pow (2,t-k+1)-1);
}
 
//希尔排序
void  shellSort( int  array[], int  n, int  t)
{
     void  shellInsert( int  array[], int  n, int  dk);
     int  i;
     for (i=1;i<=t;i++)
         shellInsert(array,n,dkHibbard(t,i));
}
 
//此写法便于理解,实际应用时应将上述三个函数写成一个函数。

C++

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
void  swapInt( int  * a, int *b)
{
  int  c=*a;
  *a=*b;
  *b=c;
}
void  shell( int *data,unsigned  int  len)
{
  if (len<=1||data==NULL)
   return ;
  for ( int  div =len/2; div >=1; div = div /2) //定增量div,并不断减小
  {
   for ( int  i=0;i<= div ;++i) //分组成div组
   {
    for ( int  j=i;j<len- div ;j+= div ) //对每组进行插入排序
     for ( int  k=j;k<len;k+= div )
      if (data[j]>data[k])
       swapInt(data+j,data+k); //交换两个数的值
   }
  }
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值