关于插入排序与归并排序

算法导论 2-1 在归并排序中引入插入排序 (在归并排序中对小数组采用插入排序)虽然归并排序的最坏情况运行时间为θ(nlgn),而插入排序的最坏运行时间为θ(),但是插入排序中的常量因子可能使得它在n较小时,在许多机器上实际运行得更快。因此,在归并排序中当子问题变得足够小时,采用插入排序来使递归的叶变粗是有意义的。考虑对归并排序的一种修改,其中使用插入排序来排序长度为k的n/k个子表,然后使用标准的合并机制来合并这些子表,这里k是一个待定的值。 a. 证明:插入排序最坏情况可以在θ(nk)时间内排序每个长度为k的n/k个子表。 b. 表明在最坏情 阅读详情
  1. 插入排序
思想:假设前i个数据已排序,将第i+1个数据插入到前面已排序的数据中,那么现在前i+1个数据都已排序,具体过程看伪代码
伪代码:
INSERTION-SORT(A)
for j = 2 to A.length
key = A[j]
i=j-1
// insert A[j] into storted sequence A[1...j-1]
while i > 0  and A[i] > key
A[i+1] == A[i]
i = i - 1
A[i+1] = key
效率:
时间级:θ(n^2)。
2. 并归排序
使用了递归思想
伪代码:
MERGE-SORT(A, p, r)
if  p < r
q = [(p+r)/2]
MERGE-SORT(A, p, q)
MERGE-SORT(A, q+1, r)
MERGE(A, p, q, r)

MERGE(A, p, q, r)
n1 = q - p +1
n2 = r - q
let L[1..n1+1] and R[1..n2+1] be new arrays
for i = 1 to n1
L[i] = A[p + i -1]
for j = 1 to n2
R[j] = A[q + j]
L[n1 + 1] = ∞ //设置哨兵
R[n2 + 1] = ∞ //设置哨兵
i = 1
j = 1
for k = p to r
if L[i] <= R[j]
A[k] = L[i]
i = i + 1
else
A[k] = R[j]
j = j + 1
效率:
时间级:θ(n*log2(n) )
3. 算法实现
实现代码:
/**
 * SortUtil.java
 * 2014年10月7日 created by kalvenmeng
 * mail: kalvenmeng@163.com
 * TODO
 */
package com.mfy.tools;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Random;

public class SortUtil {
	/**
	 * <p>
	 * 插入排序算法
	 * </p>
	 * @param array input args
	 */
	public static void sortByInsertion(int[] array) {
		int temp = 0;
		for (int j = 1; j < array.length; j++) {
			temp = array[j];
			int i = j - 1;
			while (i >= 0 && array[i] > temp) {
				array[i +1 ] = array[ i];
				i--;
			}
			array[i+1] = temp;
		}
	}
	public static void mergeSort(int[] array, int p, int r ) {
		if (p < r) {
			int q = (p + r)/2;
			mergeSort(array, p, q);
			mergeSort(array, q + 1, r);
			merge(array, p, q, r);
		} 
	}
	private static void merge(int[] array, int p, int q, int r) {
		int n1 = q - p + 1;
		int n2 = r - q;
		int[] left = new int[n1 + 1];
		int[] right = new int[n2 + 1];
		for (int i=0; i < n1; i++) {
			left[i] = array[p + i];
		}
		for (int j = 0; j < n2; j++) {
			right[j] = array[q+j+1];
		}
		left[n1] = Integer.MAX_VALUE;
		right[n2] = Integer.MAX_VALUE;
		
		int i = 0;
		int j = 0;
		for (int k = p; k <= r; k++) {
			if (left[i] <= right[j]) {
				array[k] = left[i];
				i++;
			} else {
				array[k] = right[j];
				j++;
			}
		}
	}
	
	
	
	
	public static void main(String[] args) {
		int[] array = getIntArray(new Long(10), 100000);
//		int[] array = new int[]{7,6,5,4,3,2,1};
//		int[] array = getIntArray(new Long(10), 10);
		SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
		/*for (int i:array) {
			System.out.print(i + ",");
		}
		System.out.println();*/
		System.out.println(sf.format(new Date()));
		sortByInsertion(array);
//		mergeSort(array, 0, array.length-1);
		System.out.println(sf.format(new Date()));
		
		/*for (int i:array) {
			System.out.print(i + ",");
		}*/
		
	}
	
	
	
	
	
	
	private static int[] getIntArray (Long seed,int length) {
		int[] array = new int[length];
		Random random = seed != null ? new Random(seed) : new Random();
		for (int i = 0; i < length; i++) {
			array[i] = random.nextInt();
		}
		return array;
	}
}

4. 说明
在对100000个int数组排序上 插入排序用时7s左右,并归排序用时1s不到
在对900000个int数组排序上 插入排序用时12min左右 ,并归排序用时1s不到
所以随着输入项的增多插入排序在用时上会越来越多,而并归排序并没有这种情况
并归排序在时间效率上远远高于插入排序,
更多详细内容请参阅《算法与导论(原书第三版)》第二章,算法基础





八大排序之插入排序和归并排序 直接插入排序的特性总结:1. 元素集合越接近有序,直接插入排序算法的时间效率越高2. 时间复杂度:O(N^2)3. 空间复杂度:O(1),它是一种稳定的排序算法4. 稳定性:稳定。 阅读详情

相关推荐

算法设计与分析 ——插入排序算法与归并排序算法比较

插入排序算法与归并排序算法比较 实验目的 通过插入排序算法与归并排序算法效率对比体会算法在求解问题中的重要性。 实验内容 分别编写函数实现插入排序算法和归并排序算法; 利用随机函数产生大量数据存入数组作为待排序列; 分别测试待排序列数据量为1000、1万、10万、100万、1000万的情况下两种算法各自的运行时间,通过对比分析...

shinian_acmer的博客鸭 3922

c++实现快排、归并排序、插入排序

快速排序、归并排序、插入排序的c++实现 1.注释中的解释非常详细,建议直接复制代码到编译器中查看 2.头文件使用的是函数模板,可适用于各种数据类型的排序 头文件如下: #pragma once //internal sorting是数据直接就在内存中 //external sorting数据可能在文件中 //插入排序 //插入排序是从第二个元素开始一个个比较,每次仅考虑下标为i的元素应该在的...

bj_zhb的博客 352

光谱数据计算CIE值(三刺激值、CIE1931、CIE1976、CCT)软件

软件界面如下,免安装,拷贝即可使用 导入光谱数据即可计算三刺激值、CIE1931、CIE1976、CCT CIE1931、CIE1976色坐标图形只管显示 导入的光谱数据格式如下,txt文本 波长380到780,间隔1nm 注意:缺省的数据默认写0即可 下面为一些CIE相关介绍: CIE(国际发光照明委员会):原文为Commission Internationale de L’Eclairage(法)或International Commission on Illumination(英)。这个委员会创

业余程序员小徐的博客 2万+

插入排序与归并排序

浅谈插入排序与归并排序关于排序似乎从大一开始学习变成就开始在使用各种排序方法了,今天看了下有关于插入排序和归并排序的内容,并且对应在 LeetCode 上面做了两道测试题,因此就对插入排序和归并排序做一个简单的小结吧,就当做是我的学习笔记,大佬请勿嘲笑! 插入排序 归并排序 插入排序 关于插入排序主要的思想就是从左到右的遍历一个序列,有一个标识来标记,保证左边的序列有序,再往右遍历的过程中将序列

GorMing 的博客 1224

[Unity Demo]从零开始制作空洞骑士Hollow Knight第四集:制作更多的敌人

大家好久不见,终于放完中秋假期可以回自己家里打代码了,上一期我介绍了为什么和如何导入2D toolkit以及制作一个完整的敌人(就是那只蚊子包括了精灵,动画,状态机行为以及脚本)现在不妨趁热打铁制作更多的敌人。

dangoxiba的博客 1974

多雷达协同探测技术研究进展:认知跟踪与资源调度算法

源自:雷达学报作者:易伟 袁野 刘光宏 葛建军 孔令讲 杨建宇雷达是信息感知的千里眼,具有极高的军用和民用价值,广泛应用在防空预警、遥感测绘、反恐维稳等领域[1–5]。雷达信息获取与探测技术也一直是大国竞相抢占的前沿技术,同时是信息科学的重要组成部分。随着科学技术不断进步,先进电子对抗装备的不断问世和广泛列装,雷达的生存与发展正面临日益严峻的挑战。从生存环境上看,雷达面临通信等各类民用电磁干扰以及复杂的军用电磁干扰;从探测对象上看,集群、微弱、隐身、高空、低空等多样化目标的出现也给雷达探测与识别带来困难。

renhongxia1的博客 2784

在归并排序中对小数组采用插入排序

摘要: 使递归的叶子变粗【对算法,数学,计算机感兴趣的同学,欢迎关注我哈,阅读更多原创文章】在文章中,我们了解了分治算法的设计和分析方法,并且得出了归并排序算法的最坏情况运行时间为Θnlogn。在文章中,我们了解了算法分析的方法论,并且以插入排序为例,得到了插入排序最坏情况运行时间为Θn2。虽然开起来好像归并排序比插入排序的运行时间要好,但插入排序中的常量因子可能使得它在 n 较小时,在许多机器上实际运行得更快。因此归并排序中,当子问题规模足够小时,采用插入排序。

计算机、人工智能、算法和数学 963

e-puck场景搭建

可以注意到一个黑色的小窗口出现在三维视图的左上角。它显示了电子吸盘机器人的摄像头拍摄的图像。该图像将保持黑色,直到机器人的控制器明确启用相机。最后,单击右上角的“x”可以关闭它。在对话框中,选择PROTO节点(Webots项目)/robots/gctronic/e-puck/e-puck(Robot)。一个电子吸盘机器人应该出现在竞技场的中央。通过按Alt+左键单击+拖动,对机器人施加力。无法对WoodenBox节点施加力,因为默认情况下,它们没有质量,并且被视为粘在地板上。将新控制器与机器人链接。

weixin_66540163的博客 767

插入排序还是归并排序

插入排序还是归并排序 (25 分) 根据维基百科的定义: 插入排序是迭代算法,逐一获得输入数据,逐步产生有序的输出序列。每步迭代中,算法从输入序列中取出一元素,将之插入有序序列中正确的位置。如此迭代直到全部元素有序。 归并排序进行如下迭代操作:首先将原始序列看成 N 个只包含 1 个元素的有序子序列,然后每次迭代归并两个相邻的有序子序列,直到最后只剩下 1 个有序的序列。 现给定原始序列和...

永夜莫明的博客 1953

网络系统实现技术之IPX与SPX

IPX/SPXNovell NetWare网络Novell公司为适应网络发展,将主机网络转换为PC网络,开发了Novell NetWare网络系统。该系统中基于客户机/服务器模式。以普通PC机做为客户机,以性能强大的服务器做为服务器,为客户机提供文件服务、数据库服务及其他服务。与前面的SNA模型一样,Novell NetWare也早于OSI模型,所以不能与OSI模型严格对应,但也有很明

成片的大树 9164

SAP RAP 校验全流程:从 EML 读取到消息上屏与阻止落库

本文系统梳理了 SAP ABAP RAP 中的校验流程(The Validation Process),结合 Airline/Connection 案例,详细讲解了三类核心校验:语义键唯一性、外键有效性和字段间一致性。文章覆盖了 EML 的 READ ENTITIES 操作、reported-* 与 failed-* 结构的使用方法、消息创建与字段绑定技巧,以及处理草稿数据时的 UNION 查询策略。通过代码示例演示了如何实现校验逻辑、生成错误消息并阻止无效数据持久化,同时提供了常见问题的排查建议。全文注重

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 334

疯狂的Java算法——插入排序,归并排序以及并行归并排序

从古至今的难题      在IT届有一道百算不厌其烦的题,俗称排序。不管是你参加BAT等高端笔试,亦或是藏匿于街头小巷的草根笔试,都会经常见到这样一道百年难得一解的问题。   今天LZ有幸与各位分享一下算法届的草根明星,排序届的领衔大神——插入排序以及归并排序。最后,在头脑风暴下,LZ又有幸认识了一位新朋友,名叫并行归并排序。接下来,咱们就一一认识一下,并且在最后来一次“算林大会”吧。  

Java's paradise 1239

2024 大型集团人力资源数字化转型业务蓝图规划及实施路径规划方案【附全文阅读】

摘要:本方案针对大型企业人力资源数字化转型需求,重点解决组织协同弱、薪酬绩效管控难等痛点。通过构建"6项能力+8大流程+4大系统"框架,分三阶段(2024-2026年)实施7大项目,包括e-HR系统更换、员工服务平台搭建等核心场景。方案优先推进基础系统改造(2024年),再完善绩效管理和数据分析(2025年),最后落地人才发展等进阶模块(2026年),实现与OA、ERP系统的数据集成,全面提升HR运营效率和员工体验。文末提供的优先级清单明确了10个数字化场景的实施顺序及预期价值。

cdfunlove的博客 1346

插入排序与归并排序及优化

看CLRS顺便做下笔记总结一下,理清思路。(所有排序例子皆为从小到大,各位觉得哪里能更好地改进都可以指出来)插入排序(c语言实现)最坏情况下的运行时间是Θ(n*n),跟冒泡排序,选择排序的最坏情况下的运行时间是相同的但是,运算的速度 插入>选择(相比冒泡交换的次数较少)>冒泡最简单的例子啦,打牌的时候一张一张的拿到手里插入排序。上代码#include<stdio.h> #include<std

日复一日,年复一年 1284

12、多旋翼飞行器动力学建模与实验分析

本文探讨了多旋翼飞行器的动力学建模过程,包括使用四元数的优势、刚体运动学与动力学模型的构建,以及螺旋桨推力和扭矩对飞行性能的影响。文章还通过基础实验和分析实验研究了质量、转动惯量和螺旋桨参数对飞行状态和控制响应的影响,并结合理论分析与仿真结果总结了多旋翼飞行器的动力学特性。最后,对未来研究方向进行了展望,以提升多旋翼飞行器的性能和可靠性。

Python的专栏 208

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

PTA插入排序还是归并排序

根据维基百科的定义: 插入排序是迭代算法,逐一获得输入数据,逐步产生有序的输出序列。每步迭代中,算法从输入序列中取出一元素,将之插入有序序列中正确的位置。如此迭代直到全部元素有序。 归并排序进行如下迭代操作:首先将原始序列看成 N 个只包含 1 个元素的有序子序列,然后每次迭代归并两个相邻的有序子序列,直到最后只剩下 1 个有序的序列。 现给定原始序列和由某排序算法产生的中间序列,请你判断该算法究...

Sinclair 3257

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

插入排序、归并排序以及小和问题

一.插入排序 插入排序的思想了类似于向一个有序的数组里面插入一个数。最初我们将一个无序的数组0~N-1的0~0部分视作有序,然后取1位置的数与0位置上的数进行比较,比0位置上数小就进行交换,比0位置上数大就不变,从而使0~1部分排成有序,以此类推。也就是说,取有序部分后边的数插入到那个有序的部分,将这个数和它前面的数依次进行比较,比前面的数小就进行交换,比前面的数大就已经找到了这个数的位置,直到...

sdr_zd的博客 2044

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

排序算法:插入排序与归并排序

插入排序;归并排序;时间复杂度分析

森屹的博客 681

【排序】归并排序利用插入排序优化

归并排序利用插入排序优化 对于归并排序的优化,除了采用一次性内存分配策略外,还可以对小规模数组采用插入排序以提高效率。 相比较而言,插入排序的原地、迭代实现的性质使得其对于小规模数组的排序更具优势。那么,一个值得思考的问题是,当子问题规模为多大时,适合采用插入排序? 考虑一个理想化的模型:有n/k个具有k个元素的列表,我们需要对每个列表采用插入排序,再利用标准合并过程完成整个排序。那

wu_yihao的专栏 2977

插入排序和归并排序

插入paiu

在路上 1658
上一篇: window下oracle服务简介
下一篇: Java中HashMap和HashSet存储机制
kalvenmeng
博客等级 码龄15年 4粉丝 6原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值