C / C++算法学习笔记(8)-SHELL排序

原始地址: C / C++算法学习笔记(8)-SHELL排序

 

基本思想
先取一个小于n的整数d1作为第一个增量(gap),把文件的全部记录分成d1个组。所有距离为dl的倍数的记录放在同一个组中。先在各组内进行直接插入排序;然后,取第二个增量d2<d1重复上述的分组和排序,直至所取的增量dt=1(dt<dt-l<;…<d2<d1),即所有记录放在同一组中进行直接插入排序为止。
该方法实质上是一种分组插入方法
算法编码
void shellSort(int v[], int n)

{

	int gap, i, j, temp;

	for(gap = n / 2;gap > 0;gap /= 2) //设定步长

	{

		for(i = gap;i < n;++i) //在元素间移动为止

		{

			for(j = i-gap; j >= 0&&v[j] > v[j+gap]; j -= gap)

			{

				//比较相距gap的元素,逆序互换

				temp = v[j];

				v[j] = v[j+gap];

				v[j+gap] = temp;

			}

		}

	}

}


1.首先设定gap = n/2 = 4于是分组
32
34  -> 3234
43
8    ->  8 43
56
54  -> 5456
99
76  -> 7699
数列变成 328547634435699

2.gap = gap/2 = 2
于是分组
32
543456 -> 32345456
8
764399    -> 8437699
于是数列变成 328344354765699

3.gap = gap/2 = 1
于是分组
32
8344354765699

->

832344354567699
gap=1
结束……


 

 

你可能感兴趣的:(shell)