1、shell排序的命名原因。
shell排序,和Linux的shell程序没有关系;shell排序得名的原因是该排序方法是DL. Shell于
1959年基于直接插入排序算法改进提出的,所以命名为shell排序。
2、shell排序的原理
shell排序是基于直接插入排序改进的。
直接插入排序的思想是:构建一个有序的序列,把新的数字插入到有序序列当中。直接插入排
序到问题在于:每次插入都会移动大量空间,造成时间复杂度过大。直接插入排序到时间复杂度为
O(n^2)。
shell排序基于直接插入排序改进:把整个序列分割为多个部分进行插入排序,然后再进行子序
列合起来,再进行插入插入排序;这样,减少移动空间次数。直接插入排序的平均时间复杂度为
O(n^1.3);最坏的时间复杂度为O(n^2)。
3、代码实现
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define SIZE 15
int main(int argc, char *argv[])
{
int arrTest[SIZE];
int N = sizeof(arrTest) / sizeof(int);
int i = 0;
srand(time(NULL));
for(i = 0;i < SIZE;i++)
{
arrTest[i] = rand()%100;//利用随机数产生数组元素
}
for(int step = N / 2; step > 0; step /= 2)
{
for(int k = 0; k < step; k += step)
{
for(int i = k+step; i < N; i += step)
{
if(arrTest[i] < arrTest[i-step])
{
int iTmp = arrTest[i];
int j = i-step;
for( ; j >= 0 && arrTest[j] > iTmp; j -= step)
{
arrTest[j+step] = arrTest[j];
}
arrTest[j+step] = iTmp;
}
}
}
}
for(int n = 0; n < N; n++)
{
printf("%d ", arrTest[n]);
}
printf("\n");
return 0;
}
4、运行结果
5 7 11 18 21 27 32 40 40 56 65 68 72 82 89