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.shell排序的实现
shell排序的代码实现如下:
#include<stdio.h>
int main(int argc, char *argv[])
{
int arrTest[] = {7, 8, 1, 2, 6, -1};
int N = sizeof(arrTest) / sizeof(int);
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;
}