希尔排序
希尔排序(Shell Sort)是插入排序的一种算法,是对直接插入排序的一个优化,也称缩小增量排序。
希尔排序是非稳定排序算法。 希尔排序因DL.Shell于1959年提出而得名。
希尔排序是将待排序的数组元素按下标的一定增量分组 ,分成多个子序列,然后对各个子序列进行直接插入排序算法排序;然后依次缩减增量再进行排序,直到增量为1时,进行最后一次直接插入排序,排序结束。
1. 算法步骤
- 确定增量分组次数
- 每一次增量中遍历一个分组中所有的元素
- 不同分组之间的元素进行插入排序
c
o
u
n
t
=
?
l
e
n
/
2
?
count = \lfloor len/2 \rfloor
count=?len/2?
count : 增量分组次数(分多少次组) len:数组长度
2. 动图演示
3.代码实现
void swap(int* a, int* b)
{
int temp = *a;
*a = *b;
*b = temp;
}
void shell_sort(int arr[], int len)
{
for (int i = len; i != 1; i = i/2)
{
for (int j = 0; j < i/2; j++)
{
for (int k = j+i/2; k < len; k=k+i/2)
{
int temp = k;
while (1)
{
if (arr[temp] < arr[temp-i/2])
{
if (temp < (i / 2))
{
break;
}
swap(arr + temp, arr + temp - i / 2);
temp = temp - i / 2;
}
else
{
break;
}
}
}
}
}
}
void main()
{
int arr[] = { 22, 34, 3, 32, 82, 55, 89, 50, 37, 5, 64, 35, 9, 70,32};
int len = sizeof(arr) / sizeof(*arr);
printf("\nsort before\n");
for (int i = 0; i < len; i++)
{
printf("%d\t", arr[i]);
}
shell_sort(arr,len);
printf("\shell_sort after\n");
for (int i = 0; i < len; i++)
{
printf("%d\t", arr[i]);
}
system("pause");
}
4.实验结果
|