插入排序(又叫简单插入排序或者直接插入排序)
1.算法描述:从当前位置开始从后往前找比当前数字小的(注意,一定是从后往前),找到了插入到这个小的数字的后面,在找的过程中,如果前面的数字比当前这个数字大,就把这个大的数字往后挪
2.效率分析:完全有序时间复杂度为O(n),最慢时间复杂度O(n^2),空间复杂度O(1),稳定性好(没有跳跃式的交换)
3.直接插入排序越有序越快,完全有序可以达到O(n)
4.从后往前找的原因(如果完全有序,从后往前找的时间复杂度为O(n),从前往后的时间复杂度为O(n^2))
5.如果有个序列基本有序,那么优先选择直接插入排序,插入排序的特点是,越有序越快
6.稳定性:针对关键字相同的数据(形同的数字),排序前如果A在A’的前面,拍完序还能保证A还在A’的前面,那么就是稳定的 (如3 5 6 5 3’) -> (3’ 3 5 5 6)这样就是不稳定的
7.i是当前需要处理的数字的下标,j是当前序列最后一个数据的下标
void InsertSort(int *arr,int len)
{
int tmp;
int j;
for(int i = 1;i<len;i++)//i是当前需要处理的数字的下标
{
tmp = arr[i];
for(j = i-1;j>=0;j--)//处理数字之前,从后往前找位置,j是当前序列最后一个下标
{
if(arr[j]>tmp)//如果前面的数字大于当前的数字,把前面这个大的数字往后移,
{
arr[j+1] = arr[j];//后移
}
else
{
//arr[j+1] = tmp;
break;
}
}
arr[j+1] = tmp;//如果一圈下来都没有找到,那么就把他放在0下标,而此时的j=-1
}
}
插入排序 测试:
int main()
{
//直接插入排序测试:
int arr[] = {3,-4,6,7,90};
InsertSort(arr,sizeof(arr)/sizeof(arr[0]));
Show(arr,sizeof(arr)/sizeof(arr[0]));
return 0;
}