希尔排序

一:希尔排序的介绍

希尔排序是 简单插入排序改进之后的一个更高效的版本,也称缩小增量排序。

希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序:随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰好被分成一组,算法便终止。

希尔排序法的示意图:

1574606940341

二:希尔排序法应用实例:

1574607075654

三:代码实现

1.交换法:

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
public static void shellSort(int[] arr)
{
int temp = 0;
int len = arr.Length;
int count = 0;
//
for (int num = len / 2; num >0; num/= 2)
{
for (int i = num; i < arr.Length; i++)
{
for (int j = i - num; j >= 0; j -= num)
{
if (arr[j] > arr[j + num])
{
temp = arr[j];
arr[j] = arr[j + num];
arr[j + num] = temp;
}
}
}
count++;
Console.WriteLine("这是第{0}次排序", count);
print(arr);
}
}

2.移位法:

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
public static void shellSort2(int[] arr)
{
//希尔排序的第一论
//因为第一轮排序,是将10个数据分成5组,
int temp = 0;
int len = arr.Length;
int count = 0;
//将数组除2取分组的个数
for (int num = len / 2; num > 0; num /= 2)
{
//组队的值进行比较,满足条件就交换
for (int i = num; i < arr.Length; i++)
{
int j = i;
temp = arr[j];
if (arr[j]<arr[j-num])
{
//移位
while (j-num>=0&& temp<arr[j-num])
{
arr[j] = arr[j - num];
j -= num;
}
arr[j] = temp;
}
}
count++;
Console.WriteLine("这是第{0}次排序", count);
print(arr);
}
}

1574609365704

四:源码地址

Github-希尔排序源码