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)。
插入排序,適用於待排序元素數量較少,或者初始數據已經近似有序的情況。