插入排序------希尔排序(组内排序采用直接插入排序)

  希尔排序(Shell Sort)是插入排序的一种。是针对直接插入排序算法的改进。该方法又称缩小增量排序,因D.L.Shell于1959年提出而得名。正是因为这是一种基于插入排序的快速排序算法,要了解希尔排序,必须先熟悉直接插入排序的原理。

  思路:

  • 将比较的全部元素分成几个区域,好处是让该元素一次性朝最终位置前进一大步
  • 步长是希尔排序的精华之所在,算法最开始以一定的步长进行排序(规定步长必须小于待排序数据个数)。每一轮步长都在减少,当步长为1时,算法变为插入排序,这就保证了数据一定会被排序。
#include

/*
**输出整型数组元素。
*/
void
Print_Array(int ar[], int n)
{
	for (int i = 0; i < n; ++i)
	{
		/*
		**地址法。
		*/
		printf("%5d", *(ar+i));
	}
}

/*********************************************************************
*函数名称:ShellInsert
*参数名称:pArr     待排序数组
*           d       增量大小
*           n       无序数据个数
说明        希尔按增量d的插入排序
**********************************************************************/
void
ShellInsert(int *pArr, int d, int n)
{
	/*
	**出现了指针参数就要进行判空操作
	*/
	if (NULL == pArr)
	{
		return;
	}

	for (int i = d; i < n; ++i)
	{
		int j = i - d;
		
		/*
		**记录要插入的数据
		*/
		int temp = pArr[i];
		/*
		**从后向前,找到比其小的数据的位置
		*/
		while (j >= 0 && pArr[j] > temp)
		{
			pArr[j + d] = pArr[j];
			j -= d;
		}

		/*
		**存在比j位置小的数据,需要进行插入
		*/
		if (j != i - d)
		{
			pArr[j + d] = temp;
		}
	}
}

void
ShellSort(int *pAr, int n)
{
	int d = n / 2;
	while (d >= 1)
	{
		ShellInsert(pAr, d, n);
		d = d / 2;
	}
}

int
main()
{
	int ar[] = {9,7,8,6,15,4,13,2,1,0};
	int n = sizeof(ar)/sizeof(int);
	printf("源数据:\n");
	Print_Array(ar, n);
	printf("\n排序后(升序)的数据:\n");
	ShellSort(ar, n);
	Print_Array(ar, n);
	printf("\n");
	PrintUnsigned();
	return 0;
}
插入排序------希尔排序(组内排序采用直接插入排序)_第1张图片
本程序在VS2017下运行通过

你可能感兴趣的:(插入排序------希尔排序(组内排序采用直接插入排序))