排序算法 ---- 希尔排序


前言

希尔排序是在建立在直接插入排序上的优化版,首先要先掌握直接插入排序。



一、希尔排序思路


第一步:预排序

当待排序列接近有序时,再对待排序列进行直接插排非常的快,首先将排序列接近有序。

在这里插入图片描述


第二步:

对预排序后的数组进行直接插入排序。



二、预排序


当进行直接插入排序时,是当前下标 i 所在元素与 i + 1 所在元素比较。

进行预排时,使当前下标 i 所在元素和 i + gap 所在元素比较。

当 gap = 3 时:
在这里插入图片描述
当gap = 4 时

在这里插入图片描述

可以发现,gap越小,预排序后的序列越接近有序,但效率越低。gap越大,预排后的序列越不接近有序,但效率越高。 当gap = 1 时,就是直接插入排序




代码示例:

void ShellSort(int* arr, int n)
{
    
    
	if (arr == NULL || n <= 1)
		return;
	int gap = n;
	while (gap > 1)
	{
    
    
		//保证最后一次 gap等于1 进行直接插入排序
		gap = gap / 3 + 1;

		//多组并排进行插入排序
		int i;
		for (i = 0; i < n - gap; i++)
		{
    
    
			int end = i;
			int tmp = arr[end + gap];

			while (end >= 0)
			{
    
    
				if (tmp < arr[end])
				{
    
    
					arr[end + gap] = arr[end];
					end -= gap;
				}
				else
				{
    
    
					break;
				}
			}
			arr[end + gap] = tmp;

		}//end of for

	}//end of while
}

猜你喜欢

转载自blog.csdn.net/juggte/article/details/120346792