当前位置:编程学习 > C/C++ >>

冒泡排序

冒泡排序原理:
   用第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("\n");  
  
        }  
    }  
  
  
  
    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("\n");  
  
        }  
    }  
  
  
  
    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次。
 
 
补充:软件开发 , C++ ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,