`
haitaoandroid
  • 浏览: 27717 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

各种排序算法Java实现

 
阅读更多

校招快要开始了,复习一下以前的排序知识,下面的代码都是以前写的,今天翻出来又重新看了一下,贴上来。也算是复习吧。

插入排序,稳定排序(稳定是指相同的两个数在排序之后它们的相对位置不变。):

//插入排序
	 public static void insertSort(int[] a){
		 int len = a.length;
		//遍历数组
		 for(int i=1;i<len;i++){
			 int temp = a[i];
			 int j=i-1;
			 while(j>=0&&temp<a[j]){
				//循环比较插入,即向后移动...
				 a[j+1]=a[j];
				 j--;
			 }
			 a[j+1]=temp;
		 }
	 }

希尔排序,不稳定的排序

 //希尔排序,本质上是插入排序
		public static void shellSort(int[] a){
			int[] s = {1,3,5};
			int j,temp;
			int k=0;
			//x为希尔间隔参数,最外环的遍历,以希尔间隔参数遍历三次,当然希尔参数可以有很多,x为希尔间隔参数
			for(int x=s[2];x>=0;x-=2){
				//第二层循环:以当前的希尔变量循环一次一部分数组
				while(k<x){
					//以下是插入排序
					//希尔间隔参数里面的每一次插入排序
					for(int i=x+k;i<a.length;i+=x){
						temp = a[i];
						j = i-x;
						while(j>=k && a[j]>=temp){
							a[j+x] = a[j];
							j-=x;
						}
						a[j+x] = temp;
					}
					k++;
				}
				k=0;
			}
			
		}
快速排序,其实是冒泡排序的改进,是一种不稳定排序:

//快速排序
	public static void quick(int[] a,int i,int j){
		if(i<j){
			int q = quickSort(a,i,j);
			 quick(a,i,q-1);
			 quick(a,q+1,j);
		}
		return;
	}
	
	////快速排序i不可能等于数组的最后一个下标,而且最后i一定等于j,并且下标为i的值就是temp
	public static int quickSort(int[] a,int i,int j){
		if(a.length==1){
			return 0;
		}
		int temp  = a[i];
		//前后相互比较,把大于temp的值放在数组的后面,小于temp的值反正前面
		while(i<j){
			//当从后面比较时,大于temp就一直让自减
			while(temp<a[j]){
				j--;
			}
			//如果下降到i==j的时候则不要交换了
			if(i!=j){
				swap(a,i,j);
				i++;
			}
			//同上
			while(temp>a[i]){
				i++;
			}
			if(i!=j){
				swap(a,i,j);
				j--;
			}
		}
		return i;
	}
	
	public static void swap(int[] a,int i,int j){
		int temp = a[i];
		a[i] = a[j];
		a[j] = temp;
	}

选择排序,不是一个稳定的排序算法

public static void selectSort(int[] a){
		int min;
		for(int i=0;i<a.length-1;i++){
			min = i;
			for(int j = i+1;j<a.length;j++){
				//通过与临时最小的比较,得到当前的最小
				if(a[j]<a[min]){
					min = j;
				}
			}
			swap(a,i,min);
		}
	}
冒泡排序,稳定排序:

	 public static void bubbleSort(int[] a){
			for(int i=a.length-1;i>0;i--){
				for(int j=0;j<i;j++){
					if(a[j]>a[j+1]){
						swap(a,j,j+1);
					}
				}
			}
		}

归并排序,稳定排序:
public static void mergeSort(int[] a){
		mergeSort(a,0,a.length-1);
	}
	//递归合并
	public static void mergeSort(int[] a,int first,int last){
		int mid = (first+last)/2;
		if(first<last){
			mergeSort(a,first,mid);
			mergeSort(a,mid+1,last);
			merge(a,first,mid,last);
		}
	}
	//其中first,mid,last都是在数组中的索引,last==a.length-1
	public static void merge(int[] a,int first,int mid,int last){
		int[] c = new int[last-first+1];
		int aIndex = first;
		int cIndex =0;//c的索引
		int bIndex = mid+1;
		while(aIndex<mid+1 && bIndex<last+1){
			if(a[aIndex]<a[bIndex]){
				c[cIndex++] = a[aIndex++];
			}else{
				c[cIndex++] = a[bIndex++];
			}
		}
		if(aIndex<=mid){
			while(aIndex<=mid){
				c[cIndex++] = a[aIndex++];
			}
		}
		if(bIndex<=last){
			while(bIndex<=last){
				c[cIndex++] = a[bIndex++];
			}
		}
		//c排序完成之后,把c中的值都赋给a,改变a的值以便循环递归
		for(int i=0;i<c.length;i++){
			a[first+i] = c[i];
		}
		
	}
堆排序,不是稳定的排序,非常适合大数据(如百万级别的),因为快速排序和归并排序都是基于递归的,有可能发生堆栈溢出:

	//堆排序核心算法
	//调用了建堆函数和以i为最大堆的函数
	public static void heapSort(int[] a){
		buildHeap(a);
		int heapSize = a.length;
		for(int i=a.length-1;i>=0;i--){
			 swap(a,0,i);
			 heapSize--;
			 maxHeap(a,0,heapSize);
		}
	}
	
	//建造一个大顶堆,从索引a.length/2-1开始,对每个元素使用maxHeap,即可以建立一个大顶堆
	public static void buildHeap(int[] a){
		int lag = (int)Math.ceil(a.length/2)-1;
		for(int i=lag;i>=0;i--){
			maxHeap(a,i,a.length);
		}
	}
	
	//以i为最大堆,i在输入的时候,让i节点的值比他的左右子女都要大
	public static void maxHeap(int[] a,int i,int heapSize){
		//因为堆是从1开始算的,数组是从0开始算的,所以在外面是以数组的形式i传进来要加1
		int left = 2*(i+1)-1;
		int right = 2*(i+1);
		int large;
		if(left<heapSize&& a[left]>a[i]){
			large = left;
		}else{
			large = i;
		}
		if(right<heapSize && a[right]>a[large]){
			large = right;
		}
		if(large!=i){
			swap(a,i,large);
			maxHeap(a,large,heapSize);
		}
	}
以下从网上摘抄的各种排序的一些比较:


不过其中归并的额外空间应该是O(n)

参考:

博客:http://blog.csdn.net/hkx1n/article/details/3922249

分享到:
评论

相关推荐

    各种排序算法java实现

    标题 "各种排序算法java实现" 涉及到的是计算机科学中的一个重要领域——算法,特别是排序算法在Java编程语言中的具体应用。排序算法是数据结构与算法分析中的基础部分,它们用于将一组数据按照特定顺序排列。在这个...

    各种排序算法java实现的源代码.zip

    各种排序算法java实现的源代码.zip

    基于springboot的酒店管理系统源码(java毕业设计完整源码+LW).zip

    项目均经过测试,可正常运行! 环境说明: 开发语言:java JDK版本:jdk1.8 框架:springboot 数据库:mysql 5.7/8 数据库工具:navicat 开发软件:eclipse/idea

    蓄电池与超级电容混合储能并网matlab simulink仿真模型 (1)混合储能采用低通滤波器进行功率分配,可有效抑制功率波动,并对超级电容的soc进行能量管理,soc较高时多放电,较低时少放电

    蓄电池与超级电容混合储能并网matlab simulink仿真模型。 (1)混合储能采用低通滤波器进行功率分配,可有效抑制功率波动,并对超级电容的soc进行能量管理,soc较高时多放电,较低时少放电,soc较低时状态与其相反。 (2)蓄电池和超级电容分别采用单环恒流控制,研究了基于超级电容的SOC分区限值管理策略,分为放电下限区,放电警戒区,正常工作区,充电警戒区,充电上限区。 (3)采用三相逆变并网,将直流侧800v电压逆变成交流311v并网,逆变采用电压电流双闭环pi控制,pwm调制。 附有参考资料。

    017 - 搞笑一句话台词.docx

    017 - 搞笑一句话台词

    基于微信小程序的购物系统+php后端毕业源码案例设计全部资料+详细文档.zip

    【资源说明】 基于微信小程序的购物系统+php后端毕业源码案例设计全部资料+详细文档.zip 【备注】 1、该项目是个人高分项目源码,已获导师指导认可通过,答辩评审分达到95分 2、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 3、本项目适合计算机相关专业(人工智能、通信工程、自动化、电子信息、物联网等)的在校学生、老师或者企业员工下载使用,也可作为毕业设计、课程设计、作业、项目初期立项演示等,当然也适合小白学习进阶。 4、如果基础还行,可以在此代码基础上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。 欢迎下载,沟通交流,互相学习,共同进步!

    基于APS.net的办公物品管理系统全部资料+详细文档.zip

    【资源说明】 基于APS.net的办公物品管理系统全部资料+详细文档.zip 【备注】 1、该项目是个人高分项目源码,已获导师指导认可通过,答辩评审分达到95分 2、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 3、本项目适合计算机相关专业(人工智能、通信工程、自动化、电子信息、物联网等)的在校学生、老师或者企业员工下载使用,也可作为毕业设计、课程设计、作业、项目初期立项演示等,当然也适合小白学习进阶。 4、如果基础还行,可以在此代码基础上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。 欢迎下载,沟通交流,互相学习,共同进步!

    一个使用 Rust 语言编写的简单命令行计算器程序示例,它可以实现基本的加、减、乘、除运算功能

    一个使用 Rust 语言编写的简单命令行计算器程序示例,它可以实现基本的加、减、乘、除运算功能。

    “服务之心”:大学生自愿者服务网系统的功能开发

    在数字化时代背景下,网络技术的发展极大地改变了人们的生活方式,不仅满足了物质需求,也为精神生活提供了更多可能性。阅读作为精神享受的重要途径,其便捷性的需求也随之增加。为了迎合这一需求,珠江学院大学生自愿者服务网系统应运而生,旨在通过网络提供便捷的志愿服务信息。 本文详细介绍了珠江学院大学生自愿者服务网系统的开发过程。系统基于SSM框架构建,融合了Vue技术,并采用MySQL数据库,确保了系统的稳定性与安全性。文章从系统概述、需求分析、系统设计、数据库设计、系统测试以及总结等多个角度对珠江学院大学生自愿者服务网系统进行了全面分析,用户可以通过该系统轻松获取所需的志愿服务信息。 该珠江学院大学生自愿者服务网系统以其稳定的运行性能、便捷的操作流程、清晰的界面设计和全面的功能性,展现出强大的实用性。

    慧集通(DataLinkX)集成客户案例:水泥行业海运运输业务致远OA与畅捷通TCloud集成解决方案

    内容概要:文章介绍了慧集通集成平台在水泥行业海运运输业务中致远OA与畅捷通TCloud的集成方案,涵盖库存、销售、运输、财务等多个环节的数据互通与流程协同。重点介绍了通过慧集通数据集成平台实现的具体对接内容及其策略,旨在提高企业的信息化管理水平,减少人为差错,提升工作效率。 适用人群:企业信息化管理人员、IT项目负责人、ERP及OA系统的实施顾问和运维人员。 使用场景及目标:适用于希望改善业务与财务流程、降低人力成本、提升数据一致性和准确性的中小企业。帮助企业实现内部信息系统的一体化,提供了一个成功的参考案例。 其他说明:案例详细阐述了多个具体业务场景下致远OA与畅捷通TCloud的对接方法及效果验证,为企业数字化转型和信息化建设提供了宝贵的经验。

    基于java+springboot+mysql+微信小程序的社区超市管理系统 源码+数据库+论文(高分毕业设计).zip

    项目已获导师指导并通过的高分毕业设计项目,可作为课程设计和期末大作业,下载即用无需修改,项目完整确保可以运行。 包含:项目源码、数据库脚本、软件工具等,该项目可以作为毕设、课程设计使用,前后端代码都在里面。 该系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值。 项目都经过严格调试,确保可以运行!可以放心下载 技术组成 语言:java 开发环境:idea、微信开发者工具 数据库:MySql5.7以上 部署环境:maven 数据库工具:navicat

    Java毕设项目:基于spring+mybatis+maven+mysql实现的鲸落文化线上体验馆前后台管理系统【含源码+数据库+毕业论文】

    一、项目简介 本项目是一套基于SSM框架实现的鲸落文化线上体验馆 包含:项目源码、数据库脚本等,该项目附带全部源码可作为毕设使用。 项目都经过严格调试,eclipse或者idea 确保可以运行 二、技术实现 jdk版本:1.8 及以上 ide工具:IDEA或者eclipse 数据库: mysql5.7及以上 后端:spring+springmvc+mybatis+maven+mysql 前端: vue , css ,js 等 三、系统功能 系统用户包括有管理员、用户 1、后台主要功能如下: 用户登录 首页 个人中心 修改密码 个人信息 用户管理 用户禁言 视频分类管理 制作视频管理 趣味视频管理 视频预览 下载视频 系统管理 轮播图管理 历史背景 趣味故事 收藏管理等功能 2、前台主要功能如下: 用户登录 用户注册 首页 制作视频 点我收藏 点击下载 赞一下 踩一下 点击量统计 趣味视频 历史背景 趣味故事 个人中心 我的收藏等功能

    利用LabVIEW并基于LabVIEW编辑电流采样 这个已经很成熟的方案了,直接可以利用文件VI

    利用LabVIEW并基于LabVIEW编辑电流采样 这个已经很成熟的方案了,直接可以利用文件VI

    基于C++与Qt的金山培训大作业源码汇总

    本项目为金山培训大作业源码汇总,采用C++与Qt技术构建,包含401个文件,涵盖106个C++源文件、72个头文件、41个PNG图片、27个项目文件以及HTML、JavaScript、CSS等多种文件类型。项目包含四个主要模块:KVector向量库、命令行会议系统、KSvg绘图板和KHttp音乐播放器。尽管最终未能入选,但展现了作者在C++编程和Qt框架应用方面的扎实功底和努力。

    基于springboot的微服务的旅行社门店系统的设计实现源码(java毕业设计完整源码+LW).zip

    功能说明:可以管理首页、个人中心、用户管理、旅行社管理、产品分类管理、门店公告管理、行政中心管理、订单信息管理、合同信息管理、社区留言、系统管理等功能模块。环境说明:开发语言:Java框架:springboot,mybatisJDK版本:JDK1.8数据库:mysql 5.7数据库工具:Navicat11开发软件:eclipse/ideaMaven包:Maven3.6

    处理二维信号(或图像)的傅里叶变算法的MATLAB源代码,其中含:二维傅里叶变、用滤波器自动提取所需的频谱波峰、二维傅里叶反变、获取相位角分布、相位解包等频谱分析的整套流程(可用于干涉图处理)

    处理二维信号(或图像)的傅里叶变算法的MATLAB源代码,其中含:二维傅里叶变、用滤波器自动提取所需的频谱波峰、二维傅里叶反变、获取相位角分布、相位解包等频谱分析的整套流程(可用于干涉图处理)。

    基于java+springboot+mysql+微信小程序的黄师日报平安小程 源码+数据库+论文(高分毕业设计).zip

    项目已获导师指导并通过的高分毕业设计项目,可作为课程设计和期末大作业,下载即用无需修改,项目完整确保可以运行。 包含:项目源码、数据库脚本、软件工具等,该项目可以作为毕设、课程设计使用,前后端代码都在里面。 该系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值。 项目都经过严格调试,确保可以运行!可以放心下载 技术组成 语言:java 开发环境:idea、微信开发者工具 数据库:MySql5.7以上 部署环境:maven 数据库工具:navicat

    C#全自动多线程上位机源码编程 0, 纯源代码 1, 替代传统plc搭载的触摸屏 2, 工控屏幕一体机直接和plc通信 3, 功能强大,多级页签 4, 可以自由设定串口或以太网通信

    C#全自动多线程上位机源码编程 0, 纯源代码。 1, 替代传统plc搭载的触摸屏。 2, 工控屏幕一体机直接和plc通信。 3, 功能强大,多级页签。 4, 可以自由设定串口或以太网通信。 5, 主页。 6, 报警页。 7, 手动调试页。 8, 参数设定页。 9, 历史查询页。 10,系统设定页。 11, 赠送所有控件。 12,使用的西门子Plc。 13,注册opcdaauto.dll组件,用于使用opc。 15,安装kepserverEx5。 16,可以链接其他数据库。

    模拟了一个基本的SRTP项目管理系统,这里主要包括项目申请、审批、进度跟踪和结果评估等功能

    由于大学生创新创业训练计划(简称SRTP)通常涉及到项目申请、管理和评估等多个环节,以下是一个简化的Python脚本,模拟了一个基本的SRTP项目管理系统。这里主要包括项目申请、审批、进度跟踪和结果评估等功能:

    基于springboot的音乐翻唱与分享平台源码(java毕业设计完整源码+LW).zip

    项目均经过测试,可正常运行! 环境说明: 开发语言:java JDK版本:jdk1.8 框架:springboot 数据库:mysql 5.7/8 数据库工具:navicat 开发软件:eclipse/idea

Global site tag (gtag.js) - Google Analytics