52-八大排序之——①插入排序(直接插入排序,简单插入排序)

插入排序(又叫简单插入排序或者直接插入排序)

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值