算法笔记(2)-插入排序

插入排序

插入排序:对于当前索引,左边元素都是有序的,但是并不一定是元素的最终位置,为了给更小的元素腾出位置,需要移动位置。

与插入排序不同的是:如果数组的元素基本有序,则插入排序要比随机顺序的快很多。

算法描述:

(1)从第一个位置开始,认为该元素已经被排序

(2)取出下一个元素,在已经排序的元素序列中,从后向前扫描。

(3)如果该元素(已排序)大于新元素,则将该元素移到下一位置

(4)重复步骤3,知道找到已排序元素小于或者等于新元素的位置。

(5)将新元素插入到该位置后

(6)重复步骤2~5

插入排序Java代码:

package algorithm.sort;

/**
 * @author kaichen
 * */

//插入排序
public class Inserter {
	
	public static void sort(int[] arr){
		
		int len = arr.length;
		
		for(int i = 0; i < len; i++){
			int temp = arr[i];
			for(int j = i-1; j >= 0; j--){
				if(arr[j] > temp){
					swap(arr, j, j+1);
				}else{
					arr[j+1] = temp;
					break;
				}
			}
		}
	}
	
	private static void swap(int[] arr, int i, int j) {
		int temp = arr[i];
		arr[i] = arr[j];
		arr[j] = temp;
	}
}


时间复杂度

采用插入排序存在最好最坏情况,最好情况下就是序列已经是升序序列,只需要比较n-1次;最坏的情况下是序列是降序序列,需要比较n(n-1)/2.

最好的情况时间复杂度是O(n),最坏的情况时间复杂度是O(n^2),平均情况是O(n^2).

空间复杂度

插入排序的空间复杂度是O(1)

稳定性

是稳定排序

参考资料:

https://zh.wikipedia.org/wiki/%E6%8F%92%E5%85%A5%E6%8E%92%E5%BA%8F

算法(第四版)作者塞奇威克 (Robert Sedgewick) / 韦恩 (Kevin Wayn)译者谢路云 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值