插入排序将元素依次插入到已经排好序的序列中。
基本原理:
插入排序从序列第二个元素开始寻找合适位置然后插入到前面元素组成的序列中。
每次元素插入前,序列有序。
插入后,序列依旧有序。
因为插入时会与前面已序的元素进行比对。找到应该插入的位置,移动元素,空出该位置,再将该元素插入到序列中。
void InsertSort(int* pData, int num)
{
// i标识需要插入的元素
for (int i = 1; i < num; ++i)
{
// j标识i前面的元素
for (int j = 0; j < i; ++j)
{
if (pData[j] > pData[i])
{
int temp = pData[i];
// 依次后移元素,空出j空间
for (int k = i; k > j; --k)
pData[k] = pData[k - 1];
// 将元素插入
pData[j] = temp;
}
}
}
}
上面的InsertSort嵌套有点多,可以修改为:
void InsertSort(int* pData, int num)
{
// i标识需要插入的元素
for (int i = 1; i < num; ++i)
{
int j = 0;
while (j < i && pData[j] < pData[i])
++j;
// 当前元素未找到插入位置,进行下一轮
if (j == i)
continue;
// 找到插入位置,由j标识
int temp = pData[i];
// 依次后移元素,空出j空间
for (int k = i; k > j; --k)
pData[k] = pData[k - 1];
// 将元素插入
pData[j] = temp;
}
}