栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

插入排序算法

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

插入排序算法

插入排序 简单插入排序 算法思想

将待排序的一组序列分为已排好序和未排好序的两部分;
初始状态时,已排序序列只包含第一个元素,未排序序列中的元素为此后的N-1个元素;
此后,将未排序序列中的元素逐一插入到已排序的序列中;
经过N-1次插入后,排序完成。
第k-1次插入:将未排序序列的第一个元素a从右到左依次与已排序序列中的元素b比较,如果a < b,则将a和b交换。

算法模拟

对于待排序的一组序列 44, 12, 59, 36, 43, 62
第4趟排序:此次待排元素43

第4趟排序前123644594362
43 < 59,交换123644435962
43 < 44,交换123643445962
44 > 36,结束这一轮排序123643445962
算法实现
void Insertion_sort(ElementType A[], int N)
{
	ElementType tmp; 
	for(int i = 1;i < N;i++) 
	{
		tmp = A[i];
		for(int j = i; j > 0 && A[j-1] > tmp;j--) 
		{
			A[j] = A[j-1]; 
		}
		A[j] = tmp; 
	 }
}
时间复杂度分析

有两个嵌套循环,每个循环进行O(N)次比较和交换,故整个算法时间复杂度为O(n2)。

稳定性分析

是稳定的。在比较时,只有当前一个元素大于后一个元素,才会进行交换。

希尔排序 算法思想

将待排序的的一组元素按一定间隔分成若干序列,每个序列进行简单插入排序。重复选取间隔进行排序,直到最后一次间隔为1,即简单插入排序。
增量序列:选取的间隔序列,用来分割待排序列。(是一个递减的序列,最后一个元素一定为1)

算法模拟

待排序的一组元素44,12,59,36,62,43,94,7,35,52,85
增量序列:5,3,1
(同一个颜色同一个序列)

排序前441259366243947355285
第一次排序(增量5)441259366243947355285
第一次排序结果431273552449459366285
第二次排序(增量3)431273552449459366285
第二次排序结果351274352369459446285
第三次排序(增量1)351274352369459446285
第三次排序结果712353643445259628594
算法实现
void Shell_sort(ElementType A[], int N)
{
	int i,p;
	ElementType tmp;
	int Sedgewick[] = {929, 505 , 209 , 109 , 41 , 19 , 5 , 1 , 0}; //增量序列,0用来标记排序结束

	for(i = 0; Sedgewick[i]>= N;i++) // 找到初始增量序列(不超过N的最大增量)
	 ;
	
	for(int j = Sedgewick[i]; j > 0; j = Sedgewick[++j]) //每一个增量对应一次循环
	{
		for(k = j;k < N; k++)
		{
			tmp = A[k];
			for(p = k; p >= j && A[p - j] > tmp; p -= j) //以增量j为跨度在小序列中进行插入排序
				{ A[p] = A[p - j]; }
			A[p] = tmp;
		}
	}
}
时间复杂度分析

增量序列为{ ⌊ N / 2 ⌋ lfloor N/2 rfloor ⌊N/2⌋, ⌊ N / 2 2 ⌋ lfloor N/ 2^2 rfloor ⌊N/22⌋, … ,1},最差情况下时间复杂度为O(N2);
增量序列为{2k-1-1, … ,3,1},最差情况下时间复杂度为O(N3/2),平均情况下时间复杂度为O(N5/4).

稳定性分析

由于排序是在子序列中进行,所以可能发生数值相同两个元素相对位置的改变,是不稳定的。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/711613.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号