算法思想
插入排序(Insertion-Sort)的算法描述是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,通常采用in-place排序(即只需用到O(1)的额外空间的排序)。
代码实现
测试代码:
public static void main(String[] args) {
int[] array = {3, 44, 38, 5, 47, 15, 36, 26, 27, 2, 46, 4, 19, 50, 48};
// 只需要修改成对应的方法名就可以了
insertionSort(array);
System.out.println(Arrays.toString(array));
}
第一种方式:每轮,待排序的元素依次往前和已排序的元素比较,如果小于则交换位置,直到和已排序的元素全部比较完
public class Insertion
{
//基于数组
public static void insertSort1(int[] a)
{
//将a[]按升序排列
for(int i=1;i<a.length;i++)
{
// 从后往前遍历已排序列表,逐个和待排序元素比较,如果已排序元素较大,则交换它们的位置
for(int j=i;j>0&&a[j-1]>a[j];j--)
{
int temp=a[j];
a[j]=a[j-1];
a[j-1]=temp;
}
}
}
第二种方式:每轮,待排序的元素和已排序的元素区域比较,比待排序元素小的元素先后移动一位,直到找到比待排序元素小的元素,让后将其插入到其后面
public class Insertion{
//基于数组
public static void insertSort2(int[] nums )
{
//将a[]按升序排列
for(int i=1; i<nums.length; i++)
{
int j;
int temp = nums[i]; //temp是本趟待插入的数,之前从0~i-1的数全是从左→右有序递增。
for(j=i-1; j>=0&&nums[j]>temp; j--)
{
nums[j+1] = nums[j];//j指示的元素nums[j]右移一位,移动到num[j+1]的位置
}
nums[j+1] = temp;//此处j的位置指向的是插入temp的前一位,故最后需要nums[j+1] = temp
}
}
}
复杂度分析
时间复杂度
- 最坏情况下需要
~N²/2次比较和~N²/2
次交换 - 最好情况下需要
N-1
次比较和0
次交换 - 平均情况下插入排序需要
~N²/4次比较以及~N²/4
次交换
空间复杂度
空间复杂度为o(1)
稳定性分析
插入排序是稳定的排序算法。
插入排序稳定的根本原因是,待插入的元素不会插入到与自身值相同的关键字之前,所以排序前后值相同的关键字的相对顺序被保留了下来。