zoukankan      html  css  js  c++  java
  • 冒泡排序

    冒牌排序

    冒泡排序原理:
       用第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次。





  • 相关阅读:
    Maximum sum
    走出迷宫
    取石子游戏
    全排列
    BZOJ3456 城市规划
    【SHOI2016】黑暗前的幻想乡
    【AHOI2012】信号塔
    HDU5730 Shell Necklace
    线性常系数齐次递推关系学习笔记
    矩阵树定理学习笔记
  • 原文地址:https://www.cnblogs.com/james1207/p/3313328.html
Copyright © 2011-2022 走看看