Java编写冒泡排序及优化

来源:互联网 发布:淘宝家具大品牌有哪些 编辑:程序博客网 时间:2024/06/07 00:03

这是本人的第一篇博客,感慨万分.

以前写的代码的时候并没有意识到要将当时的代码片段和一些灵光记录下来,等到意识到的时候感觉错失了些什么东西…

后来习惯将自己的代码感悟和一些代码记录到电脑,但是电脑总有崩溃的时候,万一哪天电脑中病毒了或者电脑崩溃了文件不见了,我想我会死的,所以也学学程序界的各位大牛,将自己的东西保存到网上来,既可以保存知识点,也能分享出来,快乐你我他.

Java编写冒泡排序及优化

核心思想:
一组数据,每相邻的两个数比较大小(如:1与2比较,2与3比较,3与4比较),符合要求就交换数据,每比较一轮,就会得出一个数据的位置,比较次数就会少一次
如何一边比较,一边控制次数呢?所以需要两个循环,外层循环控制轮数,内层循环控制比较的次数

    public static void bubbleSort(int[] array){        //如果有20个数,只需要比较19轮,因为最后一个数没得比了..        int len = array.length-1;        for(int i=0;i<len;i++){        //每比较一轮,就可以确定一个数的位置,就可以少比一次,刚好跟i契合            for(int j=0;j<len-i;j++){                if(array[j]>array[j+1]){                    int temp = array[j+1];                    array[j+1] = array[j];                    array[j] = temp;                }            }        }    }

如果读懂了上面的代码,就会发现不管数组是有序还是无序,都会强制性的去循环比较。如果本身就是一个有序的数组,循环来循环去,不浪费事么,所以需要做一点点小小的判断

public static void bubbleSort(int[] array){        int len = array.length-1;        int temp;        //先给它一个小小的目标        boolean flag;        for(int i=0;i<len ;i++){        //每次循环都必须初始化            flag = true;            for(int j=0;j<len -i;j++){                if(array[j]>array[j+1]){                    temp = array[j+1];                    array[j+1] = array[j];                    array[j] = temp;                    //改变状态,表示比较过                    flag = false;                }            }            //如果一轮下来,flag的状态没有改变,意味着数组没有比较,也意味着数组已经有序了,GameOver            if(flag) break;        }    }

好,接下来我们继续优化
for example:
int[] array = new int[]{3,2,1,4,5,6,7,8,9,10};

如果上面的代码都读懂了,就会发现,第一轮比较完毕,会变成如下:

2 , 1 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10

但是第二轮,我们明明只需要比较一次就可以完成排序,但是算法却强制性的循环比较,循环比较,这里是不是有优化的空间?

第三轮比较的时候会发现没有可比较的了,用上面经过优化的冒泡会直接结束,如果用原始冒泡,更惨….

第一轮比较的时候,我们是不是就可以把最后一次的下标记录下来,
第二轮直接作为比较次数,代码是不是更加酸爽了.

优化如下:

    public static void bubbleSort(int[] array){        int len = array.length-1;        int standard=len;//中转参数,存储了每一轮的内层比较次数        int target;//内层比较次数,由最后一次的比较位置决定        int temp;        boolean flag;        for(int i=0;i<len;i++){            target = standard;            flag = true;            for(int j=0;j<target;j++){                if(array[j]>array[j+1]){                    temp = array[j+1];                    array[j+1] = array[j];                    array[j] = temp;                    flag = false;                    standard = j;                }            }            if(flag) break;        }    }

本文章只是针对作者的水平来写的,所以很多地方没有讲细,嘻嘻
冒泡理解深了,自然会发现它的不足之处,也不敢说自己理解透了,万一还有更优化的代码,岂不是打自己的脸
今天不知咋的,突然想写写很久前学的冒泡排序,发现自己居然写不出来,很尴尬,很难受
就到这里吧。代码还是需要多写,多练,深入理解…..

原创粉丝点击