插入排序基本思想:
插入排序的工作方式像排序一手扑克牌。开始时,我们的左手为空并且桌子上的牌面向下。然后,我们每次从桌子上拿走一张牌并将它插入左手中正确的位置。为了找到一张牌的正确位置,我们从右到左将它与已在手中的每张牌进行比较。拿在左手上的牌总是排序好的,然后把它放到合适的位置。
首先。我们从数组的第二个元素开始,让他和第一个元素比较。只需要比较一次就可以。如果第二个元素小于第一个元素那么就交换位置。换成伪代码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。
第二次外层循环,里边的循环执行的次数是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+n−1)=2n2忽略常数项,时间复杂度为:O(n2)
-
空间复杂度
没有用到额外的存储空间,空间复杂度为:O(1)