冒泡排序的优化(Java)

冒泡排序的中心思想是:从无序序列头部开始,进行两两比较,根据大小交换位置,直到最后将最大(小)的数据元素交换到了无序队列的队尾,从而成为有序序列的一部分;下一次继续这个过程,直到所有数据元素都排好序。算法的核心在于每次通过两两比较交换位置,选出剩余无序序列里最大(小)的数据元素放到队尾。

冒泡排序算法的运作如下:

1.比较相邻的元素。如果第一个比第二个大(小),就交换他们两个。

2.对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大(小)的数。

3.针对所有的元素重复以上的步骤,除了最后已经选出的元素(有序)。

4.持续每次对越来越少的元素(无序元素)重复上面的步骤,直到没有任何一对数字需要比较,则序列最终有序。

图示:

冒泡排序的优化(Java)

 

冒泡算法如下:

package learn;

public class Learn {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int []a={3,8,5,10};
		for(int i=0;i<=3;i++)
		{
			for(int j=0;j<3;j++)
			{
				
				if(a[j]<a[j+1])
				{	int temp=a[j];
					a[j]=a[j+1];
					a[j+1]=temp;
				
				}
			}
			
		}
		
		for(int k=0;k<=3;k++)
		{
			System.out.println(a[k]);
		}
		

	}

}

结果如下:

冒泡排序的优化(Java)

最原始的冒泡排序法对于小量的数据比较快,但是如果数据量很大,那么按照原始的算法效率就很低。

走一遍程序可以发现,for循环每次都要把整个数组都比一遍大小。但是循环一次之后,最大的数就到了最后一个,下一次循环就没有必要再去和max比对,与倒数第二个数比就好。第二次循环之后,第二大的数就到了倒数第二个位置,那么下一次循环也没有必要再去比对这个数。

因此我们可以冒泡算法进行一个优化。

算法如下:

		for(int i=0;i<=3;i++)
		{
			for(int j=i ;j<3;j++)//主要是j=i这个地方改变了。
			{
				
				if(a[j]<a[j+1])
				{	int temp=a[j];
					a[j]=a[j+1];
					a[j+1]=temp;
				
				}
			}
			
		}

结果如下:

冒泡排序的优化(Java)

这个优化后的算法主要是在每一次循环之后减少下一次的比对次数,从而提升效率。

 

如果大家有更好的优化算法,欢迎留言评论,大家一起学习呀!