Java数组排序算法,冒泡,选择,插入,快速排序

来源:互联网 发布:体积最小的单片机 编辑:程序博客网 时间:2024/04/30 15:07

1.冒泡排序

冒泡排序广泛用于数组排序,大致原理就是从第一个数开始,通过和后面一个数相比较,将较大的往后挪,一一比较之后,将最大的放到最下面。第一次比较完毕将最大的数字放到最后面,第二次比较结束以后将第二大的数字放到倒数第2位,依次进行。

其中,第5行之所以要减去(i+1),是因为每放一个最大的数字到最下面,他们就不用再比较了,也就是说它们的位置就定好了。第i次循环的时候,就已经有i+1个不用做基本比较数字了。这样做只是为了提高效率。

 public class BubbleSort{      int temp;      public void sort(int[] values){           for(int i=0;i<values.length;i++){                 for(int j=0;j<values.length-1-i;j++){                       if(values[j]>values[j+1]){                              temp=values[j];                              values[j]=values[j+1];                              values[j+1]=temp;                       }                       }                 }     } }
2.选择排序
先找到整个数组里面的最小值,将其和数组的第一个数值进行交换。然后在除了第一个数值之外的剩下的数组里面进行搜索,找到最小的数值,将其和整个数组的第二个数值交换。依次进行,直到最后一个数值。

public class SelectionSort{       public void sort(int[] values){             for(int i=0;i<values.length;i++){                    int minValueIndex = i;                    for(int j=i+1;j<values.length;j++){                           if(values[j]<values[minValueIndex]){                               minValueIndex = j;                             }                      }                   //交换数值                   int temp = values[i];                   values[i] = values[minValueIndex];                   values[minValueIndex]=temp;                                 }      }         }

第3行的i是代表数组中的第i个数(i从0开始),每一轮要做的就是将除了第0到i-1之外的其它数进行比较(i=0时例外,全部都要进行比较),将最小的数值和第i个数值进行交换。第4行的意思是,比较刚开始的时候,先假设第i个数是最小的,将其索引记下来。一旦比较的过程中发现比它小的,就将索引换成那个数值的,依次比较下来。

3.插入排序
顾名思义,假设第0个元素已经在正确的位置上,从第1个元素开始,依次和左边已经排好的序列进行比较,将值插入到左边合适的位置上。

public class InsertionSort{     public void sort(int[] values){        for(int i=1;i<values.length;i++){           for(int j=i;j>0;j--){              if(values[j]<values[j-1]){                 //交换                 int temp = values[j];                 values[j] = values[j-1];                 values[j-1] = values[j];              }           }        }     }}

4.数组自带的静态方法

这个方法是Arrays.sort(int[ ] values);

直接使用就可以了。怎么说呢?选择排序算法最主要考虑的就是效率,数组自带的这个排序方法叫做快速排序方法。看名字就知道效率最高,所以说默认情况下,就直接使用这个就行了。

说到这里,假如你想要进行反向排序的话,那么也可以使用数组自带的方法 Arrays.sort(int[ ] values, Collections.reverseOrder());

这样的话,比如你要用到比分之类的,就可以反向来排,分数越大越要排在前面。

当然,数组里面有可能存的是对象,那么排序的时候就要复杂一些。

一般有2种实现方式,第一种使用Comparable接口,第二种创建一个单独的实现了Comparator接口的类。

第一种方法,就是让数组里面存的对象所在的类实现Comparable接口。主要也就是实现CompareTo方法。比如 return o1.i<o2.i? -1:(o1.i==o2.i? 0: 1)。这样以后,就可以直接调用Arrays.sort(Object[ ] o)就可以了。

第二种方法,单独创建一个ComparatorImp类实现Comparator接口,去实现它的compare方法,跟上面一样,返回-1,0或者1。这样做有什么好处呢,将比较这件事情和类的实现分开了,将来假如想换个方式比较,那么实现一个新的ComparatorImp就行了,不影响数组中的元素本身的代码。

最好的方式,就是说元素自己实现Comparable接口,将来如果不满意就创建一个ComparatorImp之类的比较器就行了。


备注:常用的Comparator

Collections.reverseOrder()

String.CASE_INSENSITIVE_ORDER


原创粉丝点击