常见的几种排序算法

直接插入法排序

每趟从无序序列中取出第一个数插入到有序序列的合适位置,元素的最终位置在最后一趟插入后才能确定位置。也可先用循环查找插入位置,从前往后或从后往前,再将插入位置之后的元素,有序列中逐个后移一个位置,最后完成插入。该算法的特点是在寻找插入位置的同时完成元素的移动。因为元素的移动必须从后往前,则可将两个操作结合在一起完成,提高算法效率。仍可进行升序或降序排序。

int[] arr = new int[]{54,5,95,68,22,6,0,99,85,68};
		
		int length = arr.length;	//计算数组的长度

		for(int i = 1; i < length;i++)
		{				
				
				if(arr[i]<arr[i-1])		//如果索引的值小于前一个索引的值		
				{
				
					int temp = arr[i];		//定义一个临时变量存储当前索引的值。
				
					int j;

					for(j =i-1;j>=0&&temp<arr[j];j--)	//循环遍历当前索引之前的所有值,并进行比较是否对应索引的值是否小于当前索引的值。
					{
						arr[j+1]= arr[j];
					}							
					
					arr[j+1]=temp;			//因为上面的循环,这个时候其实已经j--,所以j+1索引才是我们的目标位置		
					
				}			
		}

		for(int i = 0;i<length;i++)		//循环遍历数组
		{
			System.out.print(arr[i]+",");
		}

希尔排序

先取一个小于n的整数d1作为第一个增量,把文件的全部记录分组。所有距离为d1的倍数的记录放在同一个组中。先在各组内进行直接插入排序;然后,取第二个增量d2<d1重复上述的分组和排序,直至所取的增量 =1( < …<d2<d1),即所有记录放在同一组中进行直接插入排序为止。
该方法实质上是一种分组插入方法

int[] arr = new int[]{54,5,95,68,22,6,0,99,85,68};
		int length = arr.length;
		int Incremental = length/3+1;	//增量,用数组的长度除以三加一
		
		for(int i=Incremental;i>=1;i=i/3+1)		//外层增量循环
		{
			for(int j = 0;j<length-i;j++)		//内层循环
			{
				if(arr[j]>arr[j+i])				//如果索引值大于增量索引值
				{
					int temp = arr[j+i];
					int k;
					for(k=j+i;k>j;k--)
					{
						arr[k] = arr[k-1];		//索引值后移
					}
					
					arr[k] = temp;
				}				
			}
			
			if(i==1)
			{
				break;
			}
		}
		
		for(int i = 0;i<length;i++)		//循环遍历数组
		{
			System.out.print(arr[i]+",");;
		}

冒泡法排序

比较相邻的元素。如果第一个比第二个大,就交换他们两个。
对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
针对所有的元素重复以上的步骤,除了最后一个。
持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

int[] arr = new int[]{54,5,95,68,22,6,0,99,85,68};
		int length = arr.length;
		
		for(int i = 0;i < length;i++)		//循环n(数组长度)-1 次
		{
			for(int j =0;j < length-i-1;j++)
			{
				if(arr[j]>arr[j+1])
				{
					int temp = arr[j];
					arr[j] = arr[j+1];
					arr[j+1] = temp;
				}
			}
		}
		
		
		for(int i = 0;i<length;i++)		//循环遍历数组
		{
			System.out.print(arr[i]+",");
		}

快速排序

设要排序的数组是A[0]……A[N-1],首先任意选取一个数据(通常选用数组的第一个数)作为关键数据,然后将所有比它小的数都放到它左边,所有比它大的数都放到它右边,这个过程称为一趟快速排序。值得注意的是,快速排序不是一种稳定的排序算法,也就是说,多个相同的值的相对位置也许会在算法结束时产生变动。
一趟快速排序的算法是:
1)设置两个变量i、j,排序开始的时候:i=0,j=N-1;
2)以第一个数组元素作为关键数据,赋值给key,即key=A[0];
3)从j开始向前搜索,即由后开始向前搜索(j–),找到第一个小于key的值A[j],将A[j]和A[i]的值交换;
4)从i开始向后搜索,即由前开始向后搜索(i++),找到第一个大于key的A[i],将A[i]和A[j]的值交换;
5)重复第3、4步,直到i=j; (3,4步中,没找到符合条件的值,即3中A[j]不小于key,4中A[i]不大于key的时候改变j、i的值,使得j=j-1,i=i+1,直至找到为止。找到符合条件的值,进行交换的时候i, j指针位置不变。另外,i==j这一过程一定正好是i+或j-完成的时候,此时令循环结束)。

int[] arr = new int[]{54,5,95,68,22,6,0,99,85,68};	//定义数组
		int length = arr.length;	//数组长度
		
		Sort(arr,0,length-1);		//执行快速排序
		
		for(int i = 0;i<length;i++)		//循环遍历数组
		{
			System.out.print(arr[i]+",");
		}

static void Sort(int[] arr,int low,int heigh)
	{
		int temp = arr[low];	//将数组第一个索引值作为基数,用于后续对比
		
		while(low<heigh)
		{		
			while(low<heigh&&temp<=arr[heigh])		//从高位索引值开始比较,如果小于基数值,则移到左边。
			{
				heigh--;
			}			
			if(low<heigh)
			{
				arr[low] =arr[heigh];
			}
			
			while(low<heigh&&temp>arr[low])			//从低位索引值开始比较,如果大于基数值,则移到右边。
			{
				low++;
			}			
			if(low<heigh)
			{
				arr[heigh]=arr[low];
			}
		}
		
		arr[low] = temp;		//移动基数值到最终目标位置(左边所有值小于基数,右边所有值大于基数)。
		
		//将数组切割为两部分,小于基数值和大于基数值。进行递归
		if(low<heigh)
		Sort(arr,0,low-1);
		if(heigh<(arr.length-1))
		Sort(arr,heigh+1,arr.length-1);
	}

以上。
如有不合理的地方或更好的建议,请不吝赐教,谢谢!

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
系统根据B/S,即所谓的电脑浏览器/网络服务器方式,运用Java技术性,挑选MySQL作为后台系统。系统主要包含对客服聊天管理、字典表管理、公告信息管理、金融工具管理、金融工具收藏管理、金融工具银行卡管理、借款管理、理财产品管理、理财产品收藏管理、理财产品银行卡管理、理财银行卡信息管理、银行卡管理、存款管理、银行卡记录管理、取款管理、转账管理、用户管理、员工管理等功能模块。 文中重点介绍了银行管理的专业技术发展背景和发展状况,随后遵照软件传统式研发流程,最先挑选适用思维和语言软件开发平台,依据需求分析报告模块和设计数据库结构,再根据系统功能模块的设计制作系统功能模块图、流程表和E-R图。随后设计架构以及编写代码,并实现系统能模块。最终基本完成系统检测和功能测试。结果显示,该系统能够实现所需要的作用,工作状态没有明显缺陷。 系统登录功能是程序必不可少的功能,在登录页面必填的数据有两项,一项就是账号,另一项数据就是密码,当管理员正确填写并提交这二者数据之后,管理员就可以进入系统后台功能操作区。进入银行卡列表,管理员可以进行查看列表、模糊搜索以及相关维护等操作。用户进入系统可以查看公告和模糊搜索公告信息、也可以进行公告维护操作。理财产品管理页面,管理员可以进行查看列表、模糊搜索以及相关维护等操作。产品类型管理页面,此页面提供给管理员的功能有:新增产品类型,修改产品类型,删除产品类型。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值