• 交换排序之冒泡排序


      冒泡排序

      温故而知新,可以为师已。O(∩_∩)O~

      冒泡排序算法是通过多次比较和交换来实现排序的,其排序流程如下:

      1.对数组中的各元素(N个),依次比较相邻的两个元素的大小。

      2.如果前面的元素大于后面的元素,就交换这个两个元素。经过第一轮的多次比较排序后,最大的元素到达了它最后的位置。

      3.再按同样的方法把剩下的元素逐个进行比较,最后就按从小到大的顺序把数组中的各元素排列好。

      即:

      第一趟:

      第一个和第二个元素比较,第二个和第三个元素比较...直到第N-1个元素和第N个元素比较,此时最大的元素跑到了最后面。比较了N-1次。

      第二趟:

      第一个和第二个元素比较,第二个和第三个元素比较...直到第N-2个元素和第N-1个元素比较,此时第二大的元素跑到了最大的元素的前面。比。较了N-2次。

      ......

      最后一趟:

      第1个元素和第2个元素比较,比较1次,即完成了冒泡排序。

      冒泡排序示意图如下:

      

      可以总结出,总共比较了N-1次,换个角度想,每一趟比较都是把最大的一个元素挑出来放到后面(当然是除了之前已经被挑出来放到后面的元素),N-1趟就能排序完成。

      这样子看来,冒泡排序是不是应该叫吹泡排序更好?大的泡泡依次被吹到了后面,小的泡泡在前面....

      冒泡排序算法在对N个数据进行排序时,无论原数据是否有序,都需要进行N-1步的排序。

      这个排序方法思路简单直观,但是缺点是效率不高。改进的方式是:若发现一趟排序过程中没有发生元素交换,冒泡排序算法就终止。

      既然冒泡排序要排序N-1趟,每趟比较的次数从N-1开始递减,那么,可以考虑用for循环嵌套来完成冒泡排序。

      原始的冒泡排序算法核心代码如下:

    1 for(int i=0;i<arr.length-1;i++){//外层循环控制总共要循环arr.length-1趟
    2     for(int j=0;j<arr.length-1-i;j++){//内层循环控制每一趟循环要比较多少次,随着趟数的递增,每一趟内需要比较的次数逐渐减少
    3         if(arr[j]>arr[j+1]){//若前一个元素比临近的后一个元素大,就执行交换操作
    4             int temp=arr[j];
    5             arr[j]=arr[j+1];
    6             arr[j+1]=temp;
    7        }
    8     }
    9 }

       写个小程序测试一下:

    public class BubbleSortDemo{
        public static void main(String args[]){
        
        int[] arr={12,3,7,58,32,14,2};
        Sort sort=new Sort();
        sort.BubbleSort(arr);
    }
    }
    
    class Sort{
    
     public void BubbleSort(int arr[]){
        for(int i=0;i<arr.length-1;i++){
            for(int j=0;j<arr.length-1-i;j++){
                if(arr[j]>arr[j+1]){
                    int temp=arr[j];
                    arr[j]=arr[j+1];
                    arr[j+1]=temp;
                }
            }
        }
        for(int i=0;i<arr.length;i++){
                System.out.print(arr[i]+" ");
    }
    }
    }
    BubbleSortDemo.java

      一开始在运行上面的程序的时候报错:“需要.class”,很费解,后来发现,原来是sort.BubbleSort(arr[]);中我多写了个“[]”,画蛇添足了。。。

      下面是改进后的冒泡排序,其实打印arr数组的代码可以另外写一个方法,但我写在了BubbleSort()方法里面,所以就顺便使用了标签来跳出外层for循环,若不使用标签而直接使用return退出方法if(!flag){return;}则无法执行下面的打印数组的代码:

     1 public class BubbleSortImprove{
     2     public static void main(String args[]){
     3     
     4     int[] arr={12,3,7,58,32,14,2,34,2145,35,356,1,0,-1,-199,-6,88};
     5     Sort sort=new Sort();
     6     sort.BubbleSort(arr);
     7 }
     8 }
     9 
    10 class Sort{
    11 
    12  public void BubbleSort(int arr[]){
    13      boolean flag;//变量flag用来标记本趟排序是否有交换发生
    14      label://标签
    15     for(int i=0;i<arr.length-1;i++){
    16         flag=false;
    17         for(int j=0;j<arr.length-1-i;j++){
    18             if(arr[j]>arr[j+1]){
    19                 int temp=arr[j];
    20                 arr[j]=arr[j+1];
    21                 arr[j+1]=temp;
    22                 flag=true;//一趟排序里只要有交换发生,就将flag改为true
    23             }
    24         }
    25         if(!flag){//如果一趟排序过程中没有发生元素交换,就证明序列已经有序,排序结束。
    26                 break label;//跳出外层的for循环
    27             }
    28     }
    29     for(int i=0;i<arr.length;i++){
    30             System.out.print(arr[i]+" ");
    31 }
    32 }
    33 }

      好吧,冒泡排序就先总结到这里。加油!!!

      

  • 相关阅读:
    【BZOJ4514】【SDOI2016】数字配对 [费用流]
    【BZOJ4517】【SDOI2016】排列计数 [数论]
    【BZOJ4516】【SDOI2016】生成魔咒 [SAM]
    【BZOJ1560】【JSOI2009】火星藏宝图 [DP]
    【BZOJ4903】【CTSC2017】吉夫特 [DP]
    【BZOJ3884】上帝与集合的正确用法 [欧拉定理]
    【BZOJ4869】相逢是问候 [线段树][欧拉定理]
    树和二叉树知识点总结
    Socket详解
    Host文件简介
  • 原文地址:https://www.cnblogs.com/dazuihou/p/3627237.html
Copyright © 2020-2023  润新知