插入排序及其优化

概要:

先看图:


第一次插入:从第二个位置开始;2比5小,所有2应该在5的前面,所以2和5交换位置;


第二次插入:3比5小,所有3,应该在5的前面,所以3和5交换位置;然后3比2大,所有2应该在3的前面,所以2和3不交换位置;


第三次插入:然后8比5大,所有5应该在8的前面,所以5和8不交换位置;


第四次插入:7比8小,所有7应该在8的前面,所以7和8交换位置;

就这样依次进行下去;这就是插入排序;

插入排序的基本思想是:

每步将一个待排序的记录,按其值的大小插入前面已经排序的文件中适当位置上,直到全部插入完为止。

代码:

void insertSort(int arr[], int n) {
		int j;
		for (int i = 1; i < n; i++) {
			//向前将数插入合适位置
			for ( j = i; j >= 1 ; j--)
                              if(a[j]<a[j-1]
				swap(arr[j] , arr[j - 1]);
                         else
                          break;//为什么可以终止循环,要想到插入排序,一个待插入的数据的前面已经是排好序的了 
		}
		
	}

插入排序优化:

在上述实例中,我们发现如果满足条件,就会进行一次swap(交换)操作,我们知道,swap(交换)是要进行三次赋值的,这样会降低算法效率,所以我们通过如下方法改善插入排序:

对应这个数组;我们从1的位置开始;先用一个变量记录1的位置的值,接下来看步骤:

先用一个变量记录1的位置的值;

1<8,所以1应该在8的前面,我们将8的位置的后一个位置(也就是1原来的位置)值赋值为8;然后考察1是否放在原来8的位置,


1<7;所以1应该在7的前面,我们将7的位置的后一个位置(也就是8原来的位置)值赋值为7;然后考察1是否放在原来7的位置,


1<6;所以1应该在6的前面,我们将6的位置的后一个位置(也就是7原来的位置)值赋值为6;然后考察1是否放在原来6的位置,


以此类推:进行以下步骤;


最后发现1应该放在2原来的位置;所以此时我们将上面记录的变量的值赋值给2原来的位置;


这样我们就完成了对1的插入;

代码

void insertSort(int arr[], int n) {

		int j;
		for (int i = 1; i < n; i++) {
			int e = arr[i];
			for ( j = i; j >= 1 && e<arr[j - 1]; j--)
				arr[j] = arr[j - 1];

			arr[j] = e;
		}	
	}

优化后的对比:

      对于第一种方法:把1插入到合适的位置需要6此的swap(交换),也就是6X3=18次赋值;而对于第二种方法:只需要7次;所以算法的效率肯定是得到了提升的。

总结:

认真领悟,对比,多练习。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值