排序算法

 1. 冒泡排序:

原理:第一轮排序:第一个跟第二个比较,如果第一个大于第二个,那就交换,否则不进行任何操作。接着进行第二 个跟第三个比较,如果第二个比第三个大的话,进行交互,否则不做任何操作。依次类推,一轮排序完毕以后,最大的值处于最后位置。

第二轮:第一个跟第二个比较,如果第一个大于第二个,那就交换,否则不进行任何操作。接着进行第二 个跟第三个比较,如果第二个比第三个大的话,进行交互,否则不做任何操作。依次类推,比较到倒数第二个结束。第二轮排序完毕以后,最大的值(第一轮排序之后,第一个到倒数第二个之间的最大值)处于倒数第二位置。

……

第n轮……….

2. 选择排序:

第一轮:在所有数里面,查找一个最小值,然后判断最小值是不是第一位的值,如果不是,那么就进行交互(最小值跟第一位进行交换操作)。

第二轮:从第二位开始,查找一个最小值。然后判断最小值是不是第二位的值,如果不是,那么就进行交互(最小值跟第二位进行交换操作)。

…..

到第(数据个数-2)轮从倒数第二位开始,查找一个最小值。然后判断最小值是不是到第二位的值,如果不是,那么就进行交互(最小值跟倒数第二位进行交换操作)。

3. 快速排序

快速排序是对冒泡排序的一种改进。

通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。


public class PaiXuSuanFa {

/**
*冒泡排序
*/

  public static void maoPaoSort(int[] a){

     for(int i = 0;i < a.length - 1; i++){ //最多做n-1趟排序
        for(int j = 0;j < a.length - i -1; j++){
         //对当前无序区间a[0......length-i-1]进行排序(j的范围很关键,这个范围是在逐步缩小的)
         if(a[j] > a[j + 1]){ //把小的值交换到前面
            int temp = a[j];
            a[j] = a[j + 1];
            a[j + 1] = temp;
         }
       }

     }

  }

/**
*选择排序
**/
  public static void selectSort(int[] a){
    int minIndex = 0;//最小数的下标
    int temp =0; //用来交换的临时变量
    if(a == null || a.length == 0){
      return;
    }

    //控制比较的轮数
    for(int i = 0;i < a.length; i++){
      minIndex = i;
      //控制每轮比较的次数
      for(int j= i+1;j < a.length; j++){
        //记录最小数的下标
        if(a[j] < a[minIndex]){
          minIndex = j;
        }
      }
      //交换位置
      if(minIndex != i){
        temp = a[i];
        a[i] = a[minIndex];
        a[minIndex] = temp;
      }
    }

  }

/**
*快速排序
*@param a
*@param start
*@param end
*/
  public static void quickSort(int[] a,int start,int end){

    int i = start,j = end;
    int key = a[start];

    while(i < j){
      while(j > i && a[j] >= key){
        j--;
      }
      if(i < j){
        a[i] = a[j];
      }

      while(i < j && a[i] < key){
        i++;
      }
      if(i < j){
        a[j] = a[i];
      }
   }
   a[i] = key;
   if(i - start > 1){
     quickSort(a, start, i - 1);
     }
   if(end - j > 1){
     quickSort(a, j + 1, end);
    }

    }

  public static void main(String[] args) {

    int[] num = {50,4,6,76};
    /*selectSort(num);*/
    for (int i : num) {
      System.out.print(i+" ");
    }
    System.out.println();
    //quickSort(num , 0 , num.length - 1);
    maoPaoSort(num);
    for (int i : num) {
      System.out.print(i+" ");
    }
  }

}

4. 插入排序:

保证操作数之前的数据是有序,然后在操作数之前查找一个比自己小同时又比自己大的一个位置进入插入。

public class Test3 {

 

   /**

    * @param args

    */

   public static void main(String[] args) {

      int[] iarr={4,76,2,6,98,34,8,57,56,67};

      //升序排列

      for(int i=1;i<iarr.length;i++){

        //当前操作数暂停

        int k=iarr[i];

        int n=i;

        //查找一个比k值大和小之间的一个位置

        while(n>0){

           if(iarr[n-1]>k){

              //移位:

              iarr[n]=iarr[n-1];

              n--;

           }else{

              break;

           }

        }

        //插入,把k值插入到查找一个比k值大和小之间的一个位置

        iarr[n]=k;

        System.out.println("查找一个比k值大和小之间的一个位置;"+n);

        for(int ii:iarr){

           System.out.print(ii+" ");

        }

        System.out.println();

      }

     

      for(int ii:iarr){

        System.out.print(ii+" ");

      }

 

   }

 

}

原文地址:https://www.cnblogs.com/changyinlu/p/4693528.html