排序---插入排序

插入排序基本思想:

在这里插入图片描述

插入排序的工作方式像排序一手扑克牌。开始时,我们的左手为空并且桌子上的牌面向下。然后,我们每次从桌子上拿走一张牌并将它插入左手中正确的位置。为了找到一张牌的正确位置,我们从右到左将它与已在手中的每张牌进行比较。拿在左手上的牌总是排序好的,然后把它放到合适的位置。

首先。我们从数组的第二个元素开始,让他和第一个元素比较。只需要比较一次就可以。如果第二个元素小于第一个元素那么就交换位置。换成伪代码for(int j=1;j>0;j–)。我们通过j变量来控制要插入比较的元素。第一个要插入的元素索引是1,第二个是2,以此类推,我们要插入所有的元素因此。j是一个变化的变量。我们用外层for来控制for(int i = 1;i<arr.length;i++);内层循环则变成了for(int j= i;j>0;j–)。

代码实现:

package insertion;

public class Insertion {
	public static void InsertionSort(int arr[]) {
		for (int i = 1; i < arr.length; i++) {
			for (int j = i; j > 0; j--) {
				if (arr[j] < arr[j - 1]) {
					int temp = arr[j];
					arr[j] = arr[j - 1];
					arr[j - 1] = temp;
				}
			}
		}
	}
}

复杂度分析:

  1. 时间复杂度
    是两个嵌套的循环,所以只看里边的就可以了。
    第一次外层循环,里边的循环执行的次数是1。
    第二次外层循环,里边的循环执行的次数是2。
    以此类推。
    所以内层循环执行的次数是:1+2+···+(n-1)
    等差数列求和:Sn=[n*(a1+an)]/2
    S n = n ( 1 + n − 1 ) 2 = n 2 2 Sn=\frac{n(1+n-1)}{2}=\frac{n^2}{2} Sn=2n(1+n1)=2n2

    忽略常数项,时间复杂度为:O(n2)

  2. 空间复杂度
    没有用到额外的存储空间,空间复杂度为:O(1)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值