希尔排序
来源:互联网 发布:闪电软件下载 编辑:程序博客网 时间:2024/06/05 19:25
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
- 希尔排序
- 希尔排序
- 希尔排序
- 希尔排序
- 希尔排序
- 希尔排序
- 希尔排序
- 希尔排序
- 希尔排序
- 希尔排序
- 希尔排序
- 希尔排序
- 希尔排序
- 希尔排序
- 希尔排序
- 希尔排序
- 希尔排序
- 希尔排序
- [Jquery]设置表单元素不可用input disable
- 诡异的磁盘空间100%报警分析得出df -h与du -sh的根本性差别
- 控制反转
- 迭代器模式
- springboot 框架搭建
- 希尔排序
- Windows下使用DOS命令进入MySQL数据库
- 01 K-近邻算法(1)
- mybatis 判断字符串是否相等
- http协议学习-全面理解HTTP
- MFC 使用CFileDialog打开多个文件
- git add -A和 git add . git add -u作用和区别
- oracle中的nvl函数讲解
- Kafka设计解析(六)- Kafka高性能架构之道