flag = 0 说明对各子序列排序时都无元素交换的动作
flag = 1 说明对各子序列排序时有元素交换的动作
#include <stdio.h>
#include <string.h>
void SHELL_SORT(int key[],int n){
int gap = n;
while(gap>1){
gap = gap/2;
int flag = 0;
do
{
flag = 0;
for (int i=0;i<=n-gap;i++)
{
int j=i+gap;
if (key[i]>key[j])
{
int temp = key[i];
key[i] = key[j];
key[j] = temp;
flag = 1;
}
}
} while (flag!=1);
}
for (int i=0;i<n;i++)
{
if (i==n-1)
{
printf("%d
",key[i]);
}else{
printf("%d ",key[i]);
}
}
}
int main(){
/* printf("请输入n的数值
");
int n;
scanf("%d",&n);
int a[100];
for (int i=0;i<n;i++)
{
scanf("")
}*/
int a[] = {49,38,65,97,76,13,27,49};
int n = (sizeof(a))/sizeof(int); //求数组的长度
SHELL_SORT(a,n);
return 0;
}
分析:最外层while循环为log2n数量级,中间层do-while循环为n数量级,谢尔排序的时间复杂度在==O(nlog2n)与O(n2)==之间,有人做过测试,谢尔排序的时间复杂度稍大于O(nlog2n),接近于O(n1.23)。