一、插入排序:
插入排序,顾名思义就是将所要排序时的那个插入进有序的数字里面。
void InserSort(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;
}
}
二、希尔排序:
插入排序时希尔排序的一种特殊情况。
希尔排序就是将一组数据分为gap(一个整数)组,然后对每一组进行排序,是对插入排序的一种优化,然后继续重复上述分组和排序,当gap=1时,就排好序了。
下图就是gap = 3的分组情况。(红色一组,蓝色一组,绿色一组)
希尔排序:
1、首先分为若干组
2、对每一个子组进行插入排序,与上面不一样的就是每次都要跳过gap个元素。
3、逐渐减小gap的值,减小跳过的元素。
4、最后在进行一次插入排序即可
(这样感觉是不是很麻烦,但是因为每一次跳过的元素很多,比如说我有个数组9,8,7,6,5,4,3,2,1如果插入排序9就会要走8次,但是如果我对它进行分组之后,9就只走了3次,所以实际上希尔排序是比插入排序更快的)
void Print(int* a,int n)
{
for (int i = 0; i < n; i++)
{
printf("%d ", a[i]);
}
printf("\n");
}
void ShellSort(int* a, int n)
{
int gap = n;
while (gap > 1)
{
gap /= 2;//最后一次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];
end -= gap;
}
else
{
break;
}
}
a[end + gap] = tmp;
}
}
}
void TestShellSort()
{
int a[] = { 2,3,7,1,9,1,7,8,5,4 };
int n = sizeof(a) / sizeof(a[0]);
Print(a, n);
ShellSort(a, n);
Print(a, n);
}
int main()
{
TestShellSort();
return 0;
}