算法基础遍之选择冒泡算法详解

在前面编的算法基础中,我给讲解的是最基本的一个排序算法,即选择排序算法,我想这是最简单的排序方式了,思路也很好理解,为了延伸基础起见,下面我在讲解一个关于冒泡排序算法的思想,当然这也只是一个最简单的基本实现方式,希望能给初学算法者做最好的参考,以下我就先来说说实现冒泡算法的基本原理吧,我还是以一个数组为列:

首先我们需要定义一个数组:int[] arr = new int[]{2,3,2,1,2,3,4,23,236,34,2,2,23,232,4,5,78,8};

在这里我对这个数组进行分析,并可以把这个数组比喻成一个栈池,然而在这个数组里内部的值就代表一些物体的质量,当其栈池下的某个数值位置的质量小于其上层物质值质量时就会相对置换其位置来保持质量水位的平衡,一次轮询个得出最重的物质质量向最下沉,其次最轻的物质质量就往上冒,如:a[n]为栈底的元素,a[n-1]为其栈相对元素的上层,一次有a[n-2]....a[n-m].....a[1],如果a[n]<a[n-1]的话,就定义一个临时变量来对a[n]进行存储:int tmp = a[n],把a[n]与a[n-1]的位置进行交换:a[n-1] = a[n],然后再把tmp赋予给a[n-1] = tmp,OK,这样就简单实现了冒泡的原理过程,它也是分两层循环来实现的,只是第二层循环我们是从最高的位置开始取值对其对比的,所以叫冒泡排序其实现代码如下:

public class BubbleSortJsd{

       public static void main(String args[]){

             int[] arr = new int[]{3,6,7,23,445,4,3,4,5,67,8,9,0,4,3,32,23,3,43,34};

             String arrs = getBubbleSorts(arr);

             System.out.println(arrs);

       }

      

       public static String getBubbleSorts(int[] arr){

              for(int i=0;i<arr.length;i++){

                     for(int j=i.length-1;j>i;j--){

                             if(arr[j] < arr[j-1]){

                                 int tem = arr[j];

                                 arr[j] = arr[j-1];

                                 arr[j-1] = tmp;

                             }

                     }

                     System.out.println(arr[i]+"/t");

              }

              return arr.toString;

      }

}

好了,以上其最简单的核心代码,只是在运行时请注意,如在第一层循环时,有人可能会认为,我是不是可以使用i<arr.length-1来少循环一次,如果你这样做的话,你已经占用了一个值,然而这个值你没有去做最后的比较就不能对其得到,因为你在第二层循环的时候是从最后的一个值来进行,所以我们在推进下标实现时时减1来获取最后的一个值,所以必须在第一层需要执行到最后一个值来进行与第二层最前的一个值来对比操作,OK,基本就是这些需要注意的,不过你还是得检查一下,这样的代码是不是会有什么问题呢,要是在这个方法你处理多个循环的数据非常大与需要写很多的代码来实现时,我们是不是感觉到使用这一个方法会很困惑,甚至会感觉到这个方法你的代码真是乱透了,在前面章节我也强调过这样的问题,在这里我还会继续强调,在后面的章节中,我还会继续强调怎样的问题,因为这关系我们在软件开发中对软件质量的好与坏的评价问题,然而软件质量不是从单个方面来考虑的,它是从容多种描述后的结晶,如软件可扩展性就是现在我们在做软件开发过程中所必需首次考虑的,其次就是代码的判断质量,如:if(true){return xxx;}else{return xxx;}这样的代码我想多数人看了就会感觉到别扭,要知道每一次返回即RETURN时都会做一次内存的消耗数读取,甚至在返回时出现不能返回的问题,这时问题就会出现很多,OK,然而我们这样写:boolean flag;if(true){flag=true}else{flag = false;} return flag;这样写出来的代码是不是会更优美一些,而且只是多了一个标志符就改变了只需要一次返回就可以实现,好了,现在我就把上面简单得不能再简单的代码进行重构吧,看看我们能获得最终的效果是什么呢:

public class BubbleSortJsd{

      public static void main(String args[]){

              int[] arr = new int[]{3,6,7,23,445,4,3,4,5,67,8,9,0,4,3,32,23,3,43,34};

              String arrs = getBubbleSort(arr);

              System.out.println(arrs);

      }

      public static String getBubbleSort(int[] arr){

                for(int i=0;i<arr.length;i++){

                    oneSort(arr,i);                     

                }

                return arr.toString();

      }

      public static void oneSort(int[] arr,int i){

             for(int j=i.length-1;j > i;j--){

                   twoSort(arr,j);

             }

             System.out.println(arr[i]+"/t");

      }

      public static void swap(int[] arr,int j){

             if(arr[j]<arr[j-1]){

                int temp = arr[j];

                arr[j] = arr[j-1];

                arr[j-1] = temp;

             }

      }

}

以上就是为重构后的代码,这样看上去是不是美妙得多,这在我们需要在一个方法里进行很多代码的编写做清晰的维护是很好的解决方案,希望有关看本文章的人能在其中获得更多的美妙编程后的感受效果,这就写在这里,下章我将会介绍插入排序的详细使用请关注.....

你可能感兴趣的:(编程,算法,String,存储,Class,扩展)