1、测试代码
#include <iostream>
using namespace std;
int g_loop = 0; /* 循环计数 */
int g_move = 0; /* 数据移动次数 */
void output_info(int *buff,int len, int flag)
{
int i;
if(0 == flag)
{
cout << "before: ";
}
else
{
cout << "after: ";
}
for(i = 0; i < 5; ++i)
{
cout << *(buff + i) << " ";
}
cout << endl;
}
void insert(int *buff, int pos, int value)
{
int i = pos - 1;
while(1)
{
++g_loop;
if((i >= 0) && (*(buff + i) > value))
{
*(buff + i + 1) = *(buff + i);
--i;
++g_move;
}
else
{
break;
}
}
if(i != pos - 1)
{
*(buff + i + 1) = value;
}
}
int main(void)
{
int pos;
int buff[5]= {6,7,8,9,10};
for(pos = 1; pos < 5; ++pos)
{
output_info(buff, 5, 0);
insert(buff,pos,buff[pos]);
output_info(buff, 5, 1);
cout << endl;
}
cout << "move=" << g_move << endl;
cout << "loop=" << g_loop << endl;
return 0;
}
写法2,用for循环:
void insert_sort(int *buff, int len)
{
int i,j;
int temp;
if(NULL == buff)
{
return;
}
if(len < 2)
{
return;
}
for(i = 1; i < len; ++i)
{
temp = *(buff + i);
for(j = i - 1; j >= 0; --j)
{
if(*(buff + j) > temp)
{
*(buff + j + 1) = *(buff + j);
}
else
{
break;
}
}
if(j != i - 1)
{
*(buff + j + 1) = temp;
}
}
}
2、最坏情况下循环次数
int buff[5]= {10,9,8,7,6};
3、最好情况下循环次数
int buff[5]= {6,7,8,9,10};
4、算法分析
- 原地排序算法;
- 稳定排序算法;
- 空间复杂度 O(1);
- 时间复杂度 O(n^2)。
插入排序,适用于待排序元素数量较少,或者初始数据已经近似有序的情况。