插入排序 算法

算法思路

  1. 维护一段有序数列
  2. 同时遍历待排序数列,在有序数列中找到合适的位置插入元素

基本代码

实现如下:

void insertion(vector<int>& arr){
	for(int i=1;i<arr.size();i++){
		int temp=i;
		for(int j=i-1;j>=0;j--){//有序序列不断得增加
			if(arr[temp]<arr[j]) {//待排序数列中的数小于有序数列中的数,则插入
				swap(arr[temp],arr[j]);//每发现一个小于待排序的元素时则交换
				temp --;
			}
		}
	}
}

优化:

找到当前待插入元素的位置之后再插入,减少交换次数

void insertion1(vector<int>& arr){
	for(int i=1;i<arr.size();i++){
		int temp=arr[i];
		int j=i-1;
		for(;j>=0 && temp<arr[j];j--){//移动有序数列的元素位置
			arr[j+1] = arr[j];
		}
		arr[j+1] = temp;//插入元素
	}
}

算法分析

时间复杂度:最优一次遍历排序完成O(n);最差是O(n^2),逆序数组,每次插入元素都要比较已排序的元素个数次。
空间复杂度:O(1),临时变量temp

发布了239 篇原创文章 · 获赞 17 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/Z_Stand/article/details/104261836