Shell希尔排序

希尔排序法又称缩小增量法。
希尔排序法的基本思想是:先选定一个增量整数dk,把待排序文件中所有记录分成若干个组,所有距离为dk的记录分在同一组内,并对每一组内的记录进行排序。
然后,取缩小增量的方法重复上述分组和排序的工作。当增量到达1时,所有记录在统一组内排好序。
如图所示:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
代码实现如下:

void ShellInsert(int* arr, int left,int right, int dk)
{
    
    
	for (int i = left+dk; i < right; i++)
	{
    
    
		if (arr[i] < arr[i - dk])
		{
    
    
			int temp = arr[i];
			int end = i - dk;
			while (end >= left && temp < arr[end])
			{
    
    
				arr[end + dk] = arr[end];
				end -= dk;
			}
			arr[end+dk] = temp;
		}
	}
}
int dtal[] = {
    
     5,3,2,1 };//增量
void ShellSort(int* arr, int left, int right)
{
    
    
	int t = sizeof(dtal) / sizeof(dtal[0]);
	for (int i = 0; i < t; i++)//趟数
	{
    
    
		ShellInsert(arr, left,right,dtal[i]);
	}

}

可能有的人会有疑惑,增量应该怎么设置.数据量少,增量可以我们自己随便定。如果数据量大怎么设置呢?那么,下面就是改良版希尔排序。
代码如下:

//改良版希尔排序
void ShellSort(int* arr, int left, int right)
{
    
    
	int dk = right - left;
	while (dk > 1)
	{
    
    
		dk = dk / 3 + 1;
		for (int i = left + dk; i < right; i++)
		{
    
    
			if (arr[i] < arr[i - dk])
			{
    
    
				int temp = arr[i];
				int end = i - dk;
				while (end >= left && temp < arr[end])
				{
    
    
					arr[end + dk] = arr[end];
					end -= dk;
				}
				arr[end + dk] = temp;
			}
		}
	}
}

猜你喜欢

转载自blog.csdn.net/weixin_46078890/article/details/108834530