2、稳定排序二——插入排序

2、插入排序
  • 通过插入和比较 来排序:

    • 插入时 首先和前面序列的最后一个元素比较,如果要插入的元素更大,则该元素放在序列的最后;反之,则向前遍历,直到找到比要插入的元素小的元素,然后插入这个元素的后面即可。
    • 注意,由于插入排序是原地排序,所以当小于末尾元素时 需要移动元素,层层覆盖
  • 稳定性:如果要插入的元素和当前遍历的元素相等,也插入到该元素的后面。因为原序列前面的元素先插,后面的元素后插,所以相等的元素顺序不变,故稳定

  • 时间复杂度 on^2 ,空间 o1,稳定排序,原地排序

  • 代码:

  void print(vector<int>& a, int n, int i) {
  	cout << "step"<< i << ": ";
  	for (int j = 0; j < n; j++) {
  		cout << a[j] << " ";
  	}
  	cout << endl;
  }
  
  void insertionSort(vector<int>& a, int n) {//{ 9,1,5,6,2,3 }
  	for (int i = 1; i < n; ++i) // 从第二个元素开始遍历
      {
          j = i - 1;// j指向前一个元素
          int x = a[i];
  		if (x < a[j]) // 比较它和前面序列的最后一个元素,如果是>,什么都不用做了;如果是<,说明要移动元素了
          {   
              a[i] = a[j];//移到i的位置
              j--;// j指向倒数第二个元素
              
  			while (j >= 0 && x < a[j]) // 只要 x < a[j]了,说明就要移动元素了
              {   
  				a[j + 1] = a[j];// 把a[j]往后移一格
  				j--; //指向前一个元素    
  			}
              //若x>a[j]了,则x放在它后面。放心,原先在这个位置的元素已经往后移一格了
  			a[j + 1] = x;     
  		}
  
  		print(a, n, i);      //打印每趟排序的结果
  	}
  }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值