简单排序算法时间空间复杂度分析及应用(2)-插入排序

  简单排序算法时间空间复杂度分析及应用(2)-插入排序    


   上一篇文章提到了一些新的概念,不言而喻,概念的功能对人类来说是一项伟大的发现,百度对“概念”的定义是这样的:概念具有两个基本特征,即概念的内涵和外延;概念的内涵就是指这个概念的含义,即该概念所反映的事物对象所特有的属性。

     简而言之,内循环,外循环,循环方向,循环节点这些概念能让我们的大脑清晰清楚算法的作用过程和结果。

             插入排序同样也有内循环和外循环,外循环的循环节点将已确定区域和待确定区域分隔开来,该节点属于待确定区域(即待确定节点),循环方向由左向右(如图所示),外循环的起点是第二个节点,循环终点是最后一个节点。内循环是子已确定区域进行的,方向是和外循环方向相反,循环起点是外循环节点的前一个节点,终点是第一个小于外循环节点的内循环节点,如图所示。对于比较简答易懂算法例子分析微博文章推荐给大家:以人的身高站队的例子,下面我也借鉴了这位大神的微博图片,请参考:

                                  

              内循环排序图:


插入排序的时间复杂度是n的平方,同冒泡排序一样,当数据一开始就已经排好序了时间复杂度就是0,当数据一开始就是倒序的,复杂度就是n*(n-1)/2,这两种情况是一个最小,一个最大的两种情况。这样的情况和冒泡排序一样

插入排序java实现(1)先查后插:

  	/*
	 * 插入排序(insert Sort)
	 * 时间复杂度为O(n的平方) ,最好的情况是元素交换次数为0,元素比较次数为n-1。
	 * @param   sortOrder true表示增序,FALSE表示降序
	 * 第一种插入排序:先查移动元素节点,然后转移元素集合,将查和移位分开处理,即:先查后插
	 */
	/*
	 * 我这个插入排序问题很大,时间复杂度稍微比真正的插入排序要多一点,多在了内循环:两个并列的内循环
	 */
	public static void insertSort1(boolean sortOrder){
		
		int k ;
		
		for(int m = 1 ; m < array.length ; ++m)
			{
				int n;
				for(n = m - 1 ; n >= 0 ; --n)
					if((array[m] > array[n]&&sortOrder)||(array[m] < array[n]&&!sortOrder))
						break;
				int z ;
				k = array[m];
				for(z = m-1 ; z > n ;  --z)
					array[z+1] = array[z];
//				if(array[m]!=k)
					array[z+1] = k;
			}
	}
	

插入排序(2)边查边插:

	 * 插入排序(insert Sort)
	 * 时间复杂度为O(n的平方) ,最好的情况是元素交换次数为0,元素比较次数为n-1。
	 * @param   sortOrder true表示增序,FALSE表示降序
	 * 第一种插入排序:这种插入排序没有查找节点的步骤,只有比较移动元素步骤
	 * 这一种插入拍寻:插入排序改进,内循环只有一个,即边查边插
	 */
	
	public static void insertSort2(boolean sortOrder){
		
		int k;
		for(int m = 1 ; m < array.length ; ++ m)
		{
			int n ;
			k = array[m];
			for(n = m-1 ; n >= 0; --n)
				if((array[n] > k && sortOrder)||(array[n] < k && !sortOrder))
					array[n+1] = array[n];
				else break;
			array[n+1] = k;
		}
	}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

比特科技软件开发工作室

你的鼓励是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值