思维导图:

一,插入排序
代码:
void InsertSort(int* a, int n)
{   
	for (int i = 1;i < n;i++)
	{
		int end = i-1;
		int tmp = a[i];
		while (end >= 0)
		{
			if (tmp < a[end])
			{
				a[end + 1] = a[end];
				end--;
			}
			else
			{
				break;
			}
		}
		a[end + 1] = tmp;
	}
}代码分析:
插入排序的时间复杂度
二,希尔排序
代码:单趟
void Shellsort(int* a, int n)
{
	int gap = 3;//
	for (int i = 0;i < n - gap;i+=gap)
	{
		int end = i;
		int tmp = a[i+gap];
		while (end>=0)
		{
			if (tmp < a[end])
			{
				a[end+gap] = a[end ];
				a[end] = tmp;
				end -= gap;
			}
			else
			{
				break;
			}
		}
		a[end + gap] = tmp;
	}
}多趟:
代码:
void Shellsort(int* a, int n)
{
	int gap = 3;//
	for (int j = 0;j < gap;j++) //加循环
	{
		for (int i = j;i < n - gap;i += gap)//i随着j变化来控制排序不同的组
		{
			int end = i;
			int tmp = a[i + gap];
			while (end >= 0)
			{
				if (tmp < a[end])
				{
					a[end + gap] = a[end];
					a[end] = tmp;
					end -= gap;
				}
				else
				{
					break;
				}
			}
			a[end + gap] = tmp;
		}
	}
}两层循环写法:
void Shellsort1(int* a, int n)
{
	int gap = 3;//
		for (int i = 0;i < n - gap;i++)
		{
			int end = i;
			int tmp = a[i + gap];
			while (end >= 0)
			{
				if (tmp < a[end])
				{
					a[end + gap] = a[end];
					a[end] = tmp;
					end -= gap;
				}
				else
				{
					break;
				}
			}
			a[end + gap] = tmp;
		}
	
}代码:
void Shellsort(int* a, int n)
{
	int gap = n;//最大的gap
	while (gap > 1) {
		gap = gap / 3 + 1;//最小为gap为1
		for (int i = 0;i < n - gap;i++)
		{
			int end = i;
			int tmp = a[i + gap];
			while (end >= 0)
			{
				if (tmp < a[end])
				{
					a[end + gap] = a[end];
					a[end] = tmp;
					end -= gap;
				}
				else
				{
					break;
				}
			}
			a[end + gap] = tmp;
		}
	}
	
}









