插入排序(直接插入排序)
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main()
{
int a[] = {1, 19, 13, 8, 13, 19, 18, 8, 3, 7};
int len = sizeof(a) / sizeof(a[0]);
int i = 0, j = 1;
while (j < len)
{
if (a[i] > a[j])
{
int t = i;
while (a[t] > a[j] && t >= 0)
{
int tt = a[t];
a[t] = a[j];
a[j] = tt;
t--;
j--;
}
i++;
j = i + 1;
}
else
{
i++;
j = i + 1;
}
}
for (int i = 0; i < len; i++)
printf("%d ", a[i]);
//system("pause");
return 0;
}
插入排序在基本有序、元素距离最终位置较近时效率较高(插入时移动次数较少)
希尔排序,对插入排序的优化,实现思想是对数据分组进行插入排序,使其逐步变得有序,每次排序后减小步长(增大分组数量)。步长一般取长度的一半并逐次减半至1(步长为1时即为直接插入排序)
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main()
{
int a[] = {1, 19, 13, 8, 13, 19, 18, 8, 3, 7};
int len = sizeof(a) / sizeof(a[0]);
int b = len;
while (b /= 2)//当完成步长为1的排序后结束
{
for (int i = 0; i < b; i++)
{
int j = i;//有序部分的最后一个元素
int k = i + b;//无序部分第一个元素,即要插入的元素
while (k < len)
{
if (a[j] > a[k])
{
int t = a[k];
int tt = j;
while (tt >= 0 && t < a[tt])
{
a[tt + b] = a[tt]; //a[tt]比a[k]大,将tt位置腾出来
tt -= b;
}
a[tt + b] = t; // 插入位置在tt指向的后一个位置
j += b;
k = j + b;
}
else
{
j += b;
k = j + b;
}
}
}
}
for (int i = 0; i < len; i++)
printf("%d ", a[i]);
// system("pause");
return 0;
}