冒泡排序

冒牌排序

冒泡排序原理:
   用第1个数对比第2个数,判断如果第一个数大于第二数,则把第一个数与第二个数交换位置,否则保持不变。然后再一轮判断第2个数与第3个数,如果第二数大于第三个数则把他们交换位置,否则保持不变。依次类推到最后一个数。折腾的第一次将把最大的数排到了最后去,折腾第二次则把第二大的数排到了最大数的前面。如果一共只有3个数,那么折腾2回就排序好了。
   我想之所以叫冒泡排序,就是像水底往水面上冒泡一样,最上面的泡泡是最大的,然后越往下的泡泡就越小,就行这个程序一样,这些数字都是气泡,把大的冒到最上面去。最后穿成一串气泡,冒泡。我觉得叫土话叫做前后多次对比排序好理解。


例子:

public class Tmp
{
	public static void bubbleSort(int[] array)
	{
		//冒泡排序开始
		for(int i = 0; i <= array.length - 2; i++)	//①  
		{
			for(int j = 0; j <= array.length -i - 1; j++)	//②  
			{
				if(j + 1 <= array.length - 1 && array[j] > array[j + 1])
				{
					int temp = array[j];
					array[j] = array[j + 1];
					array[j + 1] = temp;
				}
				
				
			}

			//冒泡排序结束

			//输出每次排序的结果
			System.out.println("di" + (i + 1) + "sort");

			for(int k = 0; k < array.length; k++)
			{
				System.out.print(array[k] + " ");
			}

			System.out.println("
");

		}
	}



	public static void main(String[] args)
	{
		int[] array = {4, 7, 8, 9, 3, 2};
		
		bubbleSort(array);
			
	}
}


程序解析:
1、上面有2个循环,必须的。


2、上面① 处的作用确定对比的次数(循环的次数),共有6个数,所以需要循环5次就能排序好了。array.length - 2 就是    4,因为第一次是从0算起的,所以0-4共5次。


3、② 处的for(int j = 0; j <= array.length -i - 1; j++) ,其实-i 这一条语句可以不写,也一样前后对比一遍,因为   第一次的对比的出最大的结果,第二次得到第二大的结果...依次类推,所以这里-i 就是循环一次减去最后面的一个数    ,因为它是最大的已经确定的,就不用再去对比了,这样也是优化程序。-1就更不用说了,因为0-5是6个数。如果0-6就   7了,就错了,一共只有6个数。


4、if(j + 1 <= array.length - 1 && array[j] > array[j + 1]) ,最前面判断,j + 1 最大为5,也就是第6个数。如果   不判断的话,当j = 5的时候,后面会执行 array[j + 1],这时候数组下标就变成了6(表7个数),就超出数组长度了    。


---------------------------------------


·上面的“冒泡排序”很容易看懂,但是存在性能问题。下面小小的优化一下,比上面难看懂,但性能更好。

public class BubbleSortTest
{
	public static void bubbleSort(int[] array)
	{
		for(int i = 0; i < array.length - 1; i++)	//① 
		{
			for(int j = 0; j < array.length - i - 1; j++)	//② 
			{
				if(array[j] > array[j + 1])
				{
					int temp = array[j];
					array[j] = array[j + 1];
					array[j + 1] = temp;
				}
				
				
			}

			System.out.println("第" + (i + 1) + "趟排序");

			for(int k = 0; k < array.length; k++)
			{
				System.out.print(array[k] + " ");
			}

			System.out.println("
");

		}
	}



	public static void main(String[] args)
	{
		//int[] array = {4, 7, 8, 9, 3, 2};
		int[] array = {6, 5, 4, 3, 2, 1};
		
		bubbleSort(array);
			
	}
}


解析程序:
1、第① 处程序 for(int i = 0; i < array.length - 1; i++) ,判断i小于5,那么只能是4,与上面程序一样。


2、比上面更精简,并且下面的if判断,也用再加最大值为5的限制条件了。并且程序性能更优了。if(array[j] > array[j + 1])   因为array[j +1] 当前面的j=4的时候,这里的array数组下标要+1,所以就是5了,5代表6个数。总结:6个数的对比,只用5次。





原文地址:https://www.cnblogs.com/james1207/p/3313328.html