|
|
|
@ -0,0 +1,48 @@
|
|
|
|
|
/*原理:希尔排序本质是对插入排序的改进做法,提高效率,先将待排序列进行预排序使之接近
|
|
|
|
|
有序 ,再进行最后排序*/
|
|
|
|
|
/*时间复杂度最优:O(N^1.3),最差:O(N^1.3);
|
|
|
|
|
空间复杂度:O(1)*/
|
|
|
|
|
/*它的代码量小,不需要使用额外的内存,而且对于中等大小的数组它的运行时间是可以接受的。
|
|
|
|
|
如果你需要解决一个排序问题而又没有系统的排序函数可用,可以先用希尔排序*/
|
|
|
|
|
#include <stdio.h>
|
|
|
|
|
#include <malloc.h>
|
|
|
|
|
|
|
|
|
|
void shellSort(int *a, int len); // 函数声明
|
|
|
|
|
|
|
|
|
|
int main(void)
|
|
|
|
|
{
|
|
|
|
|
int i, len, * a;
|
|
|
|
|
printf("请输入要排的数的个数:");
|
|
|
|
|
scanf("%d",&len);
|
|
|
|
|
a = (int *)malloc(len * sizeof(int)); // 动态定义数组
|
|
|
|
|
printf("请输入要排的数:\n");
|
|
|
|
|
for (i = 0; i < len; i++) { // 数组值的输入
|
|
|
|
|
scanf("%d",&a[i]);
|
|
|
|
|
}
|
|
|
|
|
shellSort(a, len); // 调用希尔排序函数
|
|
|
|
|
printf("希尔升序排列后结果为:\n");
|
|
|
|
|
for (i = 0; i < len; i++) { // 排序后的结果的输出
|
|
|
|
|
printf("%d\t",a[i]);
|
|
|
|
|
}
|
|
|
|
|
printf("\n");
|
|
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void shellSort(int *a, int len)
|
|
|
|
|
{
|
|
|
|
|
int i, j, k, tmp, gap; // gap 为步长
|
|
|
|
|
for (gap = len / 2; gap > 0; gap /= 2) { // 步长初始化为数组长度的一半,每次遍历后步长减半,
|
|
|
|
|
for (i = 0; i < gap; ++i) { // 变量 i 为每次分组的第一个元素下标
|
|
|
|
|
for (j = i + gap; j < len; j += gap) { //对步长为gap的元素进行直插排序,当gap为1时,就是直插排序
|
|
|
|
|
tmp = a[j]; // 备份a[j]的值
|
|
|
|
|
k = j - gap; // j初始化为i的前一个元素(与i相差gap长度)
|
|
|
|
|
while (k >= 0 && a[k] > tmp) {
|
|
|
|
|
a[k + gap] = a[k]; // 将在a[i]前且比tmp的值大的元素向后移动一位
|
|
|
|
|
k -= gap;
|
|
|
|
|
}
|
|
|
|
|
a[k + gap] = tmp;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|