• 常用算法之冒泡排序


    冒泡排序:

    据说是八大排序中的其一,通俗的意思就是讲,在一组数据中,相邻元素依次比较大小,最大的放后面,最小的冒上来(or 反过来)

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

      冒泡排序算法的运作如下:

    1.  比较相邻的元素。如果第一个比第二个大,就交换他们两个。
    2.  对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
    3.  针对所有的元素重复以上的步骤,除了最后一个。
    4.  持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

    1、确定第1个数的位置:依次与其它数据相比:

      --第1次和2相比,比2大,则右移1位到2的位置上, 这时候,1在2位置上了

      --再与3相比,如果比3大,再向右移1位到3的位置上,不大则不用移动,这时候1在3位置上

      --再与4相比,如果比4大,再向右移动1位到4的位置上,不大则不用移动,这时候1在4位置上

      --再与5相比,如果比5大,再向右移动1位到5的位置上,不大则不用移动,这时候1在5位置上

      经过以上一轮4次的比较,我们可以确定1的位置。

    下图是流程图:

    2、确定第2个数的位置:依次与除1以外的其它数据相比(因为第1轮比较1的时候,已经比过了,已经确定了1的位置,所以这以后都没必要再跟1比了):

      --第1次和3相比,比3大,则右移1位到3的位置上, 这时候,2在3位置上了,不大则不用移动

      --再与4相比,如果比4大,再向右移1位到4的位置上,这时候2在4位置上,不大则不用移动

      --再与5相比,如果比5大,再向右移动1位到5的位置上,这时候1在5位置上,不大则不用移动

      经过以上一轮3次的比较,我们可以确定2的位置。

    3、确定第3个数的位置:依次与除1、2以外的其它数据相比(因为第1轮、第2轮比较1、2的时候,已经比过了,已经确定了1、2的位置,所以这以后都没必要再跟1、2比了):

      --第1次和4相比,比4大,则右移1位到4的位置上, 这时候,3在4位置上了,不大则不用移动

      --再与5相比,如果比5大,再向右移1位到5的位置上,这时候2在5位置上,不大则不用移动

      经过以上一轮2次的比较,我们可以确定3的位置。

    4、确定第4个数的位置:依次与除1、2、3以外的其它数据相比(因为第1轮、第2轮、第3轮比较1、2、3的时候,已经比过了,已经确定了1、2、3的位置,所以这以后都没必要再跟1、2、3比了):

      --第1次和5相比,比5大,则右移1位到5的位置上, 这时候,4在5位置上了,不大则不用移动

      经过以上一轮1次的比较,我们可以确定4的位置。

    5、最后的5不用再比较了,因为已经确定了其它剩下的位置,第一轮都有与5比较过,所以其它4个坑占了后,剩下的5你还有啥选择呢。已经被固定了.

    以上我只过第1轮的时候的图,让大家能了解一下站队的一个大体情况,近而来分析,那么接下来,我们来分析一下,如何用程序实现这个逻辑:

    1、首先我们就定5个数吧,那么我们可以把这5个数放在一个数组里。int[] nums={23,12,34,2,67}或int[] nums=new int[]{23,12,34,2,67},这里怎么用:开心就好!

    2、要进行4轮的比较才能确定,这一定是个循环,固定次数的,我们用for吧。for(int i=0;i<4;i++),当然你用for(int i=1;i<=4;i++)也行,不过数组是从0开始的,所以习惯i从0开始,这样也有利于看直接:数组[i],不然还每次得:数组[i-1]。4也就是:数组.length-1

    3、每一轮里面要循环不同次数比较数据确定位置,那么在第2步循环中,要再有一个循环,这是多重循环,也叫嵌套循环

    这个for循环,我们也要来分析一下,它的范围:

    第几轮(我们定的是变量i)            (内层循环)次 变量j

                  1      对应数组下标i是0            4        外层循环第1次,内层需要循环4次 =5-i-1

         2      对应数组下标i是1          3        外层循环第2次,内层需要循环3次  =5-i-1

           3      对应数组下标i是2            2        外层循环第3次,内层需要循环2次  =5-i-1

         4      对应数组下标i是3            1        外层循环第4次,内层需要循环1次  =5-i-1

    内层for循环,我们设置变量j,for(int j=0;j< ;j++),j<这个值,要找出来

    双重循环的原理是:外层循环1次,内层循环1轮(遍历),上表已经很清晰的标示出了j每轮循环里面要执行的次数,但因为我们是i是从0开始的,所以j的范围应该是5-i-1,也就是:数组.length-1-i

    4、在内层循环中还有一个条件,即前一位比后一位大的话,进行挪位,不大则不变位置,如果涉及挪位的时候,我们需要一个变量来倒腾一下交换要挪位的2个值。

        /** 从小到大 */
        private static void FromMinToMax() {
            int count[] = { 89, 18, 57, 48, 27 };
            for (int i = 0; i < count.length - 1; i++) {
                for (int j = 0; j < count.length - 1 - i; j++) {
                    if (count[j] > count[j + 1]) {
                        int temp = count[j];
                        count[j] = count[j + 1];
                        count[j + 1] = temp;
                    }
                }
                System.out.print("第" + (i + 1) + "次排序结果:");
                for (int k = 0; k < count.length; k++) {
                    System.out.print(count[k] + " ");
                }
                System.out.println();
            }
            System.out.print("从小到大排序结果:");
            for (int con : count) {
                System.out.print(con + " ");
            }
        }

    当然反之亦然 从大到小的排序例子:

    private static void FromMaxToMin() {
            int score[] = { 20, 79, 35, 60, 89, 18, 45, 58 };
            for (int i = 0; i < score.length - 1; i++) {// 进行n-1次排序

                // 对当前无序区间score[0....length-i-1]进行排序(缩小控制范围)
                for (int j = 0; j < score.length - i - 1; j++) {
                    if (score[j] < score[j + 1]) {// 把小的值交换到后方
                        int temp = score[j];
                        score[j] = score[j + 1];
                        score[j + 1] = temp;
                    }
                }
                System.out.print("第" + (i + 1) + "次排序结果:");
                for (int a = 0; a < score.length; a++) {
                    System.out.print(score[a] + " ");
                }
                System.out.println("");
            }
            System.out.print("最终排序结果:");
            for (int a = 0; a < score.length; a++) {
                System.out.print(score[a] + " ");
            }
        }

     参考链接:http://www.cnblogs.com/wuzhenbo/archive/2012/03/30/2423861.html

  • 相关阅读:
    E-Eating Together(POJ 3670)
    F-Dining Cows(POJ 3671)
    I-MooFest(POJ 1990)
    A-Apple Catching(POJ 2385)
    H-The Cow Lineup(POJ 1989)
    LOOPS(HDU 3853)
    Card Collector(HDU 4336)
    Help Me Escape (ZOJ 3640)
    Collecting Bugs(POJ 2096)
    c#大圣之路笔记——c# 从DataGrid中导出数据 Session
  • 原文地址:https://www.cnblogs.com/cold-ice/p/6025278.html
Copyright © 2020-2023  润新知