希尔排序

在这里插入图片描述

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)。

原文地址:https://www.cnblogs.com/CCCrunner/p/11781680.html