冒泡排序

来源:互联网 发布:听书软件电脑版 编辑:程序博客网 时间:2024/06/05 07:21

思想:
冒泡排序是一种极其简单的排序算法,也是我所学的第一个排序算法。它重复地走访要排序的所以元素,一次比较相邻两个元素,如果他们的顺序错误就把他们调换过来,直到没有元素再需要交换,排序完成。这个算法的名字由来是因为越小(或越大)的元素会经由交换慢慢“浮”到数列的顶端或者下沉到底部。

实现过程:(假如要求从小到大排序)
1.比较相邻的元素,如果前一个比后一个大,就把它们两个调换位置。
2.对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。
3.针对所有的元素重复以上的步骤,除了最后一个。
4.持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

效果图:

这里写图片描述

这里写图片描述
代码:

package com.xujd.suanfa;import org.junit.Test;import com.xujd.util.TextUtil;// 分类 -------------- 内部比较排序// 数据结构 ---------- 数组// 最差时间复杂度 ---- O(n^2)// 最优时间复杂度 ---- 如果序列在一开始已经大部分排序过的话,会接近O(n)// 平均时间复杂度 ---- O(n^2)// 所需辅助空间 ------ O(1)// 稳定性 ------------ 稳定public class BubbleSort {    int a[]={6,5,3,1,8,7,2,4};    int k=0;//用来记录循环次数    public void bubbleSortA(){//O(n*n)        for(int i=0;i<a.length-1;i++){//第一次循环把最大值放到最后一位,第二次循环把第二大值放到倒数第二,以此类推            for(int j=0;j<a.length-i-1;j++){//所以上面循环后的最后几位数可以不做比较   故 -i  减少比较次数                k++;                if(a[j]>a[j+1]){                    int temp= a[j];                    a[j]=a[j+1];                    a[j+1]=temp;                }            }        }        TextUtil.print(a);//依次打印数组a中的每个元素        System.out.println(k);    }    //优化1:如果某一趟没有反生数据交换,则结束比较    public void bubbleSortB(){        boolean flag=true;        for(int i=0;i<a.length-1 && flag;i++){            flag=false;            for(int j=0;j<a.length-i-1;j++){                k++;                if(a[j]>a[j+1]){                    int temp=a[j];                    a[j]=a[j+1];                    a[j+1]=temp;                    flag=true;                }            }        }        TextUtil.print(a);        System.out.println(k);    }    //优化2:设置一标志性变量pos,用于记录每趟排序中最后一次进行交换的位置。由于pos位置之后的记录均已交换到位,故在进行下一趟排序时只要扫描到pos位置即可。    public void bubbleSortC(){        int n=a.length;          int i= n -1;  //初始时,最后位置保持不变              while ( i> 0) {                   int pos= 0; //每趟开始时,无记录交换                  for (int j= 0; j< i; j++){                    k++;                    if (a[j]> a[j+1]) {                          pos= j; //记录交换的位置                           int tmp = a[j];                         a[j]=a[j+1];                        a[j+1]=tmp;                      }                     }                i= pos; //为下一趟排序作准备               }             TextUtil.print(a);            System.out.println(k);    }    //优化3:传统冒泡排序中每一趟排序操作只能找到一个最大值或最小值,    //我们考虑利用在每趟排序中进行正向和反向两遍冒泡的方法一次可以得到两个最终值(最大者和最小者) , 从而使排序趟数几乎减少了一半。    public void bubbleSortD(){        int n=a.length;        int low = 0;           int high= n -1; //设置变量的初始值          int tmp,j;          while (low < high) {              for (j= low; j< high; ++j){ //正向冒泡,找到最大者                  k++;                if (a[j]> a[j+1]) {                      tmp = a[j]; a[j]=a[j+1];a[j+1]=tmp;                  }               }            --high;  //修改high值, 前移一位              for ( j=high; j>low; --j){ //反向冒泡,找到最小者                  k++;                if (a[j]<a[j-1]) {                      tmp = a[j]; a[j]=a[j-1];a[j-1]=tmp;                  }          }            ++low;                  //修改low值,后移一位          }         TextUtil.print(a);        System.out.println(k);    }}
原创粉丝点击