博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
算法之冒泡排序
阅读量:5937 次
发布时间:2019-06-19

本文共 2497 字,大约阅读时间需要 8 分钟。

  hot3.png

冒泡排序

介绍:

冒泡排序(Bubble Sort)是一种简单的。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。

步骤:

  1. 比较相邻的元素。如果第一个比第二个大,就交换他们两个。

  2. 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。

  3. 针对所有的元素重复以上的步骤,除了最后一个。

  4. 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

101718_Llq0_2295363.gif

public  void sort(int[] arr){        int len=arr.length;        int temp;        for(int i=1;i
< len-i  ; j++) {                if(arr[j]>arr[j+1]){                    temp=arr[j+1];                    arr[j+1]=arr[j];                    arr[j]=temp;                }            }        }    }

时间复杂度分析:

    最坏情况下:

                  当数组为倒序的时候,此时最坏时间复杂度为O(n^2);

    最好的情况下:

                    这个时间复杂度的问题其实是有争议的.大家一贯任务冒泡的最佳时间复杂度是O(n),其实是不是与理解上的偏差有关系.对于上面的代码:无论元素是否已经有序,if()判断都是要走一遍的,只不过有序的话swap()操作不用走,但是其实对数组的遍历是一样的. 那这样看的话 其    实最佳情况的时间复杂度还是O(n^2).

                    那O(n)是怎么来的呢? O(n)的话应该是只需要扫描一边数组.下面这种改进的冒泡最佳时间复杂度才是O(n) ;

public void bubbleSort(int arr[]) {    boolean didSwap=false;    for(int i = 0, len = arr.length; i < len - 1; i++) {        didSwap = false;//每次需要先重置        for(int j = 0; j < len - i - 1; j++) {            if(arr[j + 1] < arr[j]) {                swap(arr, j, j + 1);                didSwap = true;            }        }        if(didSwap == false)//说明有一次比较的过程中没有元素交换发生,此时整个数组已经有序.可以停止继续进行排序.            return;    }    }//最坏:O(n^2)//最好:O(n)

    上面的代码是对冒泡的一点改进,下面是进一步的改进:双向冒泡算法

public void sort(int[] array) {        //元素位置发生了交互,设置为true        boolean flag = false;        /*外层循环每次循环完毕能确定俩个数值,一个最大值一个最小值,所以循环次数减半,        如果数组长度为奇数时,最后一次循环将剩余一个数值,此值必为中间值,无需再排        列;如果数组长度为偶数时,循环array.length/2*/        int loop = array.length/2;        for(int n = 0;n < loop;n++  ){            flag = false;             for(int m = n;m < array.length  - n -1; m++){                if(array[m] > array[m+1]){                    flag = true;                    //正向冒泡                    int temp = array[m];                    array[m] = array[m+1];                    array[m+1] = temp;                }                //array.length - 1 -m 倒数第1的元素,array.length - m -2倒数第2个元素                if(array[array.length - 1 -m] < array[array.length - m -2]){                    flag = true;                    //逆向冒泡                    int temp = array[array.length - 1 -m];                    array[array.length - 1 -m] = array[array.length - m -2];                    array[array.length - m -2] = temp;                }            }            if(flag==false){                 return;                }        }    }

转载于:https://my.oschina.net/dadou/blog/480637

你可能感兴趣的文章
c# 读取记事本txt文档到DataTable中
查看>>
BUAAOO第四单元总结
查看>>
java_分数
查看>>
守护线程与非守护线程
查看>>
Js中parentNode,parentElement,childNodes,children之间的区别
查看>>
JS复习:第三章&第四章
查看>>
webpack的问题;
查看>>
如何用JS获取ASP.net中的textbox的值 js获不到text值,【asp.net getElementById用法】
查看>>
ASP.NET弹出对话框几种基本方法
查看>>
正阳门下
查看>>
【01】Python:故事从这里开始
查看>>
理解Underscore中的_.bind函数
查看>>
关于目标检测 Object detection
查看>>
vue-cli 3.0 axios 跨域请求代理配置及生产环境 baseUrl 配置
查看>>
Morris Traversal
查看>>
随机数的扩展--等概率随机函数的实现
查看>>
UVA-10347 Medians 计算几何 中线定理
查看>>
eclipse中怎么删除重复的console
查看>>
软件工程(2019)结对编程第二次作业
查看>>
平安人寿保险-深圳Java开发工程师社招面试
查看>>