1.插入排序(从小到大排)
上图为从小到大排序的动图。
思想:从自己这个元素开始向前找自己合适的位置进行插入。直到把这一组数的位置都找好以后,才算是排序完成了。
// 插入排序
void InsertSort(int* a, int n)
{
int i = 0;
for (i = 0;i <= n-2;i++)
{
int end = i;
int tmp = a[end+1];
while (end >=0)
{
if (a[end] > tmp)
{
a[end + 1] = a[end];
end--;
}
else
{
break;
}
}
a[end + 1] = tmp;
}
}
2.希尔排序(从小到大排)
希尔排序实际上是一种进阶版的插入排序。
为了解决插入排序在逆序数据排序的进行上的不足,希尔排序思想上采用了分成gap组的思想,先分别对gap组进行排序,最后再进行总体的排序,这个过程叫做先预排序再排序。
// 希尔排序
void ShellSort(int* a, int n)
{
int gap = n;
while (gap>1)
{
gap =gap/3+1;//保证最后一次gap为1
for (int i = 0;i + gap < n;i++)
{
int end = i;
int tmp = a[end + gap];
while (end >= 0)
{
if (a[end] > tmp)
{
a[end + gap] = a[end];
end -= gap;
}
else
{
break;
}
}
a[end + gap] = tmp;
}
}
}
注意:保证最后一次的gap为1,是因为最后一次排序排完就一定要是正确地去排完所有的数据,就不能像预排序一样简单的按各组来排序了。