zoukankan      html  css  js  c++  java
  • 交换排序—冒泡排序(Bubble Sort)算法原理以及Java实现

    基本思想:

    在要排序的一组数中,对当前还未排好序的范围内的全部数,自上而下对相邻的两个数依次进行比较和调整,让较大的数往下沉,较小的往上冒。即:每当两相邻的数比较后发现它们的排序与排序要求相反时,就将它们互换。

    冒泡排序的示例:

     

    算法实现

     1 /**
     2  *
     3  * @author zhangtao
     4  */
     5 public class BubbleSort 
     6 {
     7      public static void main(String[] args)
     8     {
     9         int arr[]={3,1,5,7,2,4,9,6,45,0,-1};
    10         bubbleSort(arr);
    11     }
    12     //冒泡排序
    13    static void bubbleSort(int[] arr)
    14    {
    15        int ArrLength=arr.length;
    16        for(int i=0;i<ArrLength-1;i++)          //每次解决一个元素的位置,所以需要比较ArrLength-1次
    17        {
    18            for(int j=0;j<ArrLength-i-1;j++)    //每解决一个元素的位置,则下一个元素确定比较的次数就减少1
    19            {
    20                if(arr[j]>arr[j+1])
    21                {
    22                    int temp=arr[j];
    23                    arr[j]=arr[j+1];
    24                    arr[j+1]=temp;
    25                }
    26            }
    27            printLine(arr,i);
    28        }
    29    }
    30     //打印每次的排序结果
    31     static void printLine(int[] arr,int i)
    32     {
    33         System.out.println(i+":");
    34         int Arrlength=arr.length;
    35         for(int j=0;j<Arrlength;j++)
    36         {
    37             System.out.print(arr[j]+"  ");
    38         }
    39         System.out.println();
    40     }
    41 }

    冒泡排序算法的改进

    对冒泡排序常见的改进方法是加入一标志性变量exchange,用于标志某一趟排序过程中是否有数据交换,如果进行某一趟排序时并没有进行数据交换,则说明数据已经按要求排列好,可立即结束排序,避免不必要的比较过程。本文再提供以下两种改进算法:

    1.设置一标志性变量pos,用于记录每趟排序中最后一次进行交换的位置。由于pos位置之后的记录均已交换到位,故在进行下一趟排序时只要扫描到pos位置即可。

    改进后算法如下:

     1 void Bubble_1 ( int r[], int n) 
     2 {  
     3         int i= n -1;  //初始时,最后位置保持不变  
     4         while ( i> 0) {   
     5             int pos= 0; //每趟开始时,无记录交换  
     6             for (int j= 0; j< i; j++)  
     7                 if (r[j]> r[j+1]) {  
     8                     pos= j; //记录交换的位置   
     9                     int tmp = r[j]; r[j]=r[j+1];r[j+1]=tmp;  
    10                 }   
    11             i= pos; //为下一趟排序作准备  
    12          }   
    13     }    

    2.传统冒泡排序中每一趟排序操作只能找到一个最大值或最小值,我们考虑利用在每趟排序中进行正向和反向两遍冒泡的方法一次可以得到两个最终值(最大者和最小者) , 从而使排序趟数几乎减少了一半。

    改进后的算法实现为:

     1 void Bubble_2 ( int r[], int n){  
     2             int low = 0;   
     3             int high= n -1; //设置变量的初始值  
     4             int tmp,j;  
     5             while (low < high) {  
     6                 for (j= low; j< high; ++j) //正向冒泡,找到最大者  
     7                     if (r[j]> r[j+1]) {  
     8                         tmp = r[j]; r[j]=r[j+1];r[j+1]=tmp;  
     9                     }   
    10                 --high;                 //修改high值, 前移一位  
    11                 for ( j=high; j>low; --j) //反向冒泡,找到最小者  
    12                     if (r[j]<r[j-1]) {  
    13                         tmp = r[j]; r[j]=r[j-1];r[j-1]=tmp;  
    14                     }  
    15                 ++low;                  //修改low值,后移一位  
    16             }   
    17         }  
  • 相关阅读:
    Mysql: 一个死锁场景的解决
    Mysql: 创建新的账号
    安全评测:BashDoor
    BeanFactory和FactoryBean的区别:
    linux 下将war解压到当前目录
    学习BoolanC++笔记_01(C++面向对象高级编程(上)第一周)
    学习BoolanC++笔记_00(预备)
    Linux (Centos) 上安装Nexus OSS 3 并搭建docker私有仓库
    linux(Centos7)搭建rpm仓库
    树莓派4b安装 manjaro linux
  • 原文地址:https://www.cnblogs.com/JLZT1223/p/7414091.html
Copyright © 2011-2022 走看看