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
结束……


 

原文地址:https://www.cnblogs.com/suncoolcat/p/3310515.html