经典排序算法(Java版)



一、冒泡排序 Bubble Sort算法

最简单的排序方法是冒泡排序方法。这种方法的基本思想是,将待排序的元素看做是竖着排列的气泡,较小的元素比较轻,从而要往上浮。在冒泡排序算法中咱们要对这个气泡序列处理若干遍。所谓一遍处理,就是自底向上检查一遍这个序列,并时刻注意两个相邻的元素的顺序是否正确。若是发现两个相邻元素的顺序不对,即的元素在下面,就交换它们的位置。显然,处理一遍以后,最轻的元素就浮到了最高位置;处理二遍以后,次轻的元素就浮到了次高位置。在做第二遍处理时,因为最高位置上的元素已经是最轻元素,因此没必要检查。通常地,第i遍处理时,没必要检查第i高位置以上的元素,由于通过前面i-1遍的处理,它们已正确地排好序。这个算法可实现以下。数组

算法以下:spa

/**排序

     *冒泡排序io

     *@paramsrc待排序数组循环

     */程序

    void doBubbleSort(int[] src)方法

    {im

       int len=src.length;数据

       for(int i=0;i<len;i++)

       {

           for(int j=i+1;j<len;j++)

           {

              int temp;

              if(src[i]>src[j])

              {

                  temp=src[j];

                  src[j]=src[i];

                  src[i]=temp;

              }            

           }

           printResult(i,src);

       }     

    }

二、选择排序 Selection Sort

选择排序的基本思想是:对待排序的记录序列进行n-1遍的处理,第1遍处理是将L[1..n]中最小者与L[1]交换位置,第2遍处理是将L[2..n]中最小者与L[2]交换位置,......,第i遍处理是将L[i..n]中最小者与L[i]交换位置。这样,通过i遍处理以后,前i个记录的位置就已经按从小到大的顺序排列好了。
  固然,实际操做时,也能够根据须要,经过从待排序的记录中选择最大者与其首记录交换位置,按从大到小的顺序进行排序处理。

算法以下:

       /**

     *选择排序

     *@paramsrc待排序的数组

     */

    void doChooseSort(int[] src)

    {

       int len=src.length;

       int temp;

       for(int i=0;i<len;i++)

       {

           temp=src[i];

           int j;

           int samllestLocation=i;//最小数的下标

           for(j=i+1;j<len;j++)

           {

              if(src[j]<temp)

              {

                  temp=src[j];//取出最小值

                  samllestLocation=j;//取出最小值所在下标

              }

           }

           src[samllestLocation]=src[i];

           src[i]=temp;

           printResult(i,src);

       }

    }

3、插入排序 Insertion Sort

插入排序的基本思想是,通过i-1遍处理后,L[1..i-1]己排好序。第i遍处理仅将L[i]插入L[1..i-1]的适当位置,使得L[1..i]又是排好序的序列。要达到这个目的,咱们能够用顺序比较的方法。首先比较L[i]和L[i-1],若是L[i-1]≤ L[i]騆[1..i]已排好序,第i遍处理就结束了;不然交换L[i]与L[i-1]的位置,继续比较L[i-1]和L[i-2],直到找到某一个位置j(1≤j≤i-1),使得L[j] ≤L[j+1]时为止。
  简言之,插入排序就是每一步都将一个待排数据按其大小插入到已经排序的数据中的适当位置,直到所有插入完毕。插入排序方法分直接插入排序和折半插入排序两种,这里只介绍直接插入排序,折半插入排序留到“查找”内容中进行。
  图1演示了对4个元素进行直接插入排序的过程,共须要(a),(b),(c)三次插入。

图1 对4个元素进行插入排序

在下面的插入排序算法中,为了写程序方便咱们能够引入一个哨兵元素L[0],它小于L[1..n]中任一记录。因此,咱们设元素的类型ElementType中有一个常量-∞,它比可能出现的任何记录都小。若是常量-∞很差事先肯定,就必须在决定L[i]是否向前移动以前检查当前位置是否为1,若当前位置已经为1时就应结束第i遍的处理。另外一个办法是在第i遍处理开始时,就将L[i]放入L[0]中,这样也能够保证在适当的时候结束第i遍处理。下面的算法中将对当前位置进行判断。

算法以下:

    /**

     *插入排序(WHILE循环实现)

     *@paramsrc待排序数组

     */

    void doInsertSort1(int[] src)

    {

       int len=src.length;

       for(int i=1;i<len;i++)

       {  

           int temp=src[i];

           int j=i;

          

           while(src[j-1]>temp)

           {

              src[j]=src[j-1];

              j--;

              if(j<=0)

                  break;

           }

           src[j]=temp;

           printResult(i+1,src);

       }

    }

    /**

     *插入排序(FOR循环实现)

     *@paramsrc待排序数组

     */

    void doInsertSort2(int[] src)

    {

       int len=src.length;

       for(int i=1;i<len;i++)

       {

           int j;

           int temp=src[i];

           for(j=i;j>0;j--)

           {

              if(src[j-1]>temp)

              {

                  src[j]=src[j-1];

                 

              }else//若是当前的数,不小前面的数,那就说明不小于前面全部的数,

                   //由于前面已是排好了序的,因此直接通出当前一轮的比较

                  break;

           }

           src[j]=temp;

           printResult(i,src);

       }

    }