插入排序


算法思想

插入排序(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)

稳定性分析

插入排序是稳定的排序算法。
插入排序稳定的根本原因是,待插入的元素不会插入到与自身值相同的关键字之前,所以排序前后值相同的关键字的相对顺序被保留了下来。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值