冒泡排序算法(Java)

冒泡排序算法(Java)

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。



冒泡排序即每次遍历。相邻数字间进行比較,前者大于后者进行交换,不断将最大值后移,直至沉至最后位置;算法关键要点在于确定每次循环的边界。

后面两种算法则是对冒泡排序一定程度上的改良,但相对于其它排序算法,冒泡排序性能依旧较差。

//冒泡排序
public class Bubble_Sort {

	//最原始的解法
	public void bubble_sort1(int[] data)
	{
		int n = data.length;
		for(int i = 0; i < n; i++)
		{
			//注意循环的index范围,避免溢出
			for(int j = 0; j < n - i - 1; j++)
			{
				if(data[j] > data[j + 1])
				{
					swap(data, j , j + 1);
				}
			}
		}
	}
	
	//改进算法。通过引入一个标志量flag,推断一次循环是否有移动。若无移动,则表示
	//排序已经完毕,无需在进行下一次继续循环
	public void bubble_sort2(int[] data)
	{
		int n = data.length;
		boolean flag = true;//标示是否进行了移动
		int index = n - 1; //标示须要循环的最后一位的index
        //一旦在移动。则继续循环		
		while(flag)
		{
			flag = false;
			for(int j = 0; j < index - 1; j++)
			{
				if(data[j] > data[j + 1])
				{
					swap(data, j , j + 1);
					flag = true;
				}
			}
			index--;
		}
	}
	
	//改进算法二:当一次遍历中。最后m位都未进行转换,则表示后面n位都比当前这个最大数要大
	//依据冒泡排序知,每次沉入最大值,则后面这些位一定已经排好序
	public void bubble_sort3(int[] data)
	{
		int n = data.length;
		int index = n - 1;
		
		while(index != 0)
		{
			int k = 0;
			for(int j = 0; j < index - 1; j++)
			{
				if(data[j] > data[j + 1])
				{
					swap(data, j , j + 1);
					k = j;
				}
			}
			index = k;
		}
	}
	
	//无法像C++一样使用引用实现,故仅仅好使用data数组进行改变
	private void swap(int[] data , int a, int b)
	{
		int temp = data[a];
		data[a] = data[b];
		data[b] = temp;
	}
	
	public void print_array(int[] data)
	{
		for(int num : data)
		{
			System.out.print(num);
			System.out.print(" ");
		}
	}
	
	
	public static void main(String[] args) {
		
		Bubble_Sort bubble_Sort = new Bubble_Sort();
		int data[] = {2,34,45,2,13,24,5,24,57};
		bubble_Sort.bubble_sort3(data);
		bubble_Sort.print_array(data);

	}

}

版权声明:本文博主原创文章。博客,未经同意不得转载。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/116797.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 解析类型后加问号和双问号

    变量定义中类型后带一个问号,意思是这个数据类型是NullAble类型的。用于给变量设初值的时候,给变量(int类型)赋值为null,而不是0!例子: int?i=3等同于Nullab

    2021年12月27日
    48
  • Iocomp.Ultra Pack V5.SP3 for .Net Crack

    Iocomp.Ultra Pack V5.SP3 for .Net CrackIocomp的UltraPack是一套56个控件,用于创建专业仪器应用程序。这些控件是用100%托管代码编写的,Ω578867473支持Microsoft和Borland/CodeGear/Embarcadero开发环境。结合了我们的ProPack和PlotPack。所有控件都是面向对象的,并共享许多公共类以保持一致性、易于使用和相互连接。每个控件都经过优化,以在.Net框架下获得最佳性能,同时仍然使用高级GDI+绘图例程,这大大改善了控件的外观。大多数控件在与应用

    2022年7月25日
    12
  • linux recv返回值,recv recvfrom[通俗易懂]

    linux recv返回值,recv recvfrom[通俗易懂]recv和recvfrom都是用来接受来自的网络的数据。来看看它们的原型:intrecv(SOCKET,charFAR*,int,int);intrecvfrom(SOCKET,charFAR*,int,int,structsockaddrFAR*,intFAR*);这是在windows下面的定义。在linux下面的定义只是将SOCKET改成int,那么在linux下面的原型是这样:…

    2022年7月23日
    36
  • no debuggable processes_no port for remote debugger

    no debuggable processes_no port for remote debuggerAlwaysusethedebugruntimeduringthedevelopmentcycleUsethereleaseversionduringthedevelopmentphasetomeasuretheperformance/CPUutilizationoftheapplicationInstallan

    2022年10月11日
    6
  • vmware15最新激活码【最新永久激活】2022.02.01[通俗易懂]

    (vmware15最新激活码)本文适用于JetBrains家族所有ide,包括IntelliJidea,phpstorm,webstorm,pycharm,datagrip等。IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html…

    2022年3月31日
    141
  • 修改mysql的密码_sql数据库修改密码

    修改mysql的密码_sql数据库修改密码MySQL是一个关系型数据库管理系统,在WEB应用方面MySQL是最好的RDBMS(RelationalDatabaseManagementSystem,关系数据库管理系统)应用软件之一。搭配PHP和Apache可组成良好的开发环境。因此用的很广泛。很多人都会遇到MySQL需要修改密码的情况,比如密码太简单、忘记密码等等。这里我就教大家几种修改MySQL密码的方法。这里以修改root密码为例,操作系统为windows。注意:修改MySQL是需要有mysql里的root权限的,

    2022年8月12日
    5

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号