Algorithm
根据上一篇文章的插入排序算法步骤:
1)将第一待排序序列第一个元素看做一个有序序列,把第二个元素到最后一个元素当成是未排序序列。
2)从头到尾依次扫描未排序序列,将扫描到的每个元素插入有序序列的适当位置。(如果待插入的元素与有序序列中的某个元素相等,则将待插入元素插入到相等元素的后面。)
Code
使用vector实现插入排序算法代码如下:
/************************************************************************
插入排序
************************************************************************/
#include <iostream>
#include <vector>
#include <time.h>
using namespace std;
int main()
{
vector<int> sortBefore;
vector<int> sortAfter;
// 用当前时间作种子 使得每次随机数不同
srand((unsigned)time(NULL));
// 随机生成10个10以内的整数
for (int i = 0; i < 10; i++)
{
int num = rand() % 10;
sortBefore.push_back(num);
}
// 初始化插入排序vector,第一待排序序列第一个元素看做一个有序序列
sortAfter.push_back(sortBefore.at(0));
sortBefore.erase(sortBefore.begin());
vector<int>::iterator itB = sortBefore.begin();
vector<int>::iterator itA = sortAfter.begin();
// 从头到尾依次扫描未排序序列
while (itB != sortBefore.end())
{
// 用来标识是否插入已排序元素到中间
bool flag = false;
// 从头到尾依次扫描已排序序列
while (itA != sortAfter.end())
{
if (*itB < *itA)
{
sortAfter.insert(itA, *itB);
flag = true;
break;
}
itA++;
}
if (!flag)
{
sortAfter.push_back(*itB);
}
// 从未排序序列中删除当前元素
itB = sortBefore.erase(itB);
itA = sortAfter.begin();
}
// 测试排序结果
itA = sortAfter.begin();
int line = 0;
while (itA != sortAfter.end())
{
cout << *itA << " ";
line++;
if (line % 10 == 0)
{
line = 0;
cout << endl;
}
itA++;
}
return 0;
}
Postscript
代码书写过程中出现了 vector iterators incompatible
错误,原因是sortBefore.erase(itB);
没有赋值给itB
,导致itB
指向一个不可预期的地址,导致错误。