希尔排序(Shell's Sort)是插入排序的一种又称“缩小增量排序”(Diminishing Increment Sort),是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法。该方法因D.L.Shell于1959年提出而得名
注:建议先学习插入排序算法,再产学习希尔排序算法。
时间复杂度:O(n^2)
稳定性:不稳定
测试:
排序前: 6 1 4 2 5 3
排序后: 1 2 3 4 5 6
源码:
注:shell_sort和shell_sort2分别用两种方式实现,shell_sort2完全基于插入排序算法。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define ARRAY_N 6
int array[ARRAY_N]={6, 1 , 4, 2, 5, 3};
//int array[ARRAY_N]={1, 3, 2, 4, 5, 6};
void shell_sort(int array[], int n)
{
int step = 0;
int i = 0;
int j = 0;
int k = 0;
int tmp = 0;
for (step = n / 2; step > 0; step = step / 2)
{
for (i = 0; i < step; i++)
{
for (j = i + step; j < n; j = j + step)
{
if (array[j] < array[j - step])
{
tmp = array[j];
for (k = j - step; k >= 0; k = k-step)
{
if (tmp < array[k])
{
array[k + step] = array[k];
}
else
{
break;
}
}
array[k + step] = tmp;
}
}
}
}
}
void shell_sort2(int array[], int n)
{
int step = 0;
int i = 0;
int j = 0;
int k = 0;
int l = 0;
int tmp = 0;
for (step = n / 2; step > 0; step = step / 2)
{
for (i = 0; i < step; i++)
{
for (j = i + step; j < n; j = j + step)
{
for (l = j - step; l >= 0; l = l - step)
{
if (array[j] > array[l])
{
break;
}
}
if (l != j - step)
{
tmp = array[j];
for (k = j - step; k > l; k = k-step)
{
array[k + step] = array[k];
}
array[k + step] = tmp;
}
}
}
}
}
int show_list(int array[], int n)
{
int i = 0;
for (i=0; i < ARRAY_N; i++)
{
printf("%5d", array[i]);
}
printf("\n");
return 0;
}
int main(void)
{
int tmp[6] = {0};
show_list(array, ARRAY_N);
shell_sort(array, ARRAY_N);
//shell_sort2(array, ARRAY_N);
show_list(array, ARRAY_N);
return 0;
}