java:快速排序演算法與氣泡排序演算法

cuiyaonan2000發表於2014-11-05


Java:快速排序演算法與冒泡演算法

首先看下,氣泡排序演算法與快速排序演算法的效率:

如下的是main方法:

/**
  * 
 * @Description: 
 * @author:cuiyaonan2000@163.com
 * @date 2014年11月5日 下午1:02:10
  */
 public static void main(String[] args) {
  //快速排序演算法測試
  int[] qArray = new int[100000];
  for (int i = 0; i < 100000; i++){
   qArray[i] = (int) (Math.random() * 100000);
  }
  long beforeQ = System.currentTimeMillis();
  quickSort(qArray, 0, qArray.length-1);
  System.out.println("快速排序執行時間:" + (System.currentTimeMillis() - beforeQ));
  
  //氣泡排序演算法測試
  int[] bArray = new int[100000];
  for (int i = 0; i < 100000; i++){
   bArray[i] = (int) (Math.random() * 100000);
  }
  long beforeB = System.currentTimeMillis();
  bubble(bArray);
  System.out.println("氣泡排序執行時間:" + (System.currentTimeMillis() - beforeB));
 }

在一個有100000 個數字的陣列中排序結果如下:


 

 

如下的是大家耳熟能詳的冒泡演算法(關於冒泡就不多說了):

     

/**
  * 
 * @Description: 
 * @author:cuiyaonan2000@163.com
 * @date 2014年11月5日 下午1:00:32
  */
 public static void bubble(int[] data) {
  for (int i = 0; i < data.length - 1; i++) {
   for (int j = i + 1; j < data.length; j++)
    if (data[i] > data[j]) {
     int temp = data[j];
     data[j] = data[i];
     data[i] = temp;
    }
  }
 }

 

先說下關於快速排序演算法的思路:

  1. 選取陣列第一個數字,作為key.並設定變數i0,j為陣列長度.

  2. 從陣列最後一位開始向前找,找什麼呢?找比key小的數字(不能等於),並記錄下座標j.限制條件是,在向前找的過程中如果一直沒找到比key小的數值,就在i<j的時候停止(如果沒有找到j就做減一操作繼續找).如果找到了就將陣列[j]與陣列[i]的值對換並結束.

  3. 從陣列第一位開始向後找,找什麼呢?找比key大的數字(不能等於),並記錄下座標i.限制條件是,在向前找的過程中如果一直沒找到比key大的數值,就在i<j的時候停止(如果沒有找到i就做加一操作繼續找).如果找到了就將陣列[j]與陣列[i]的值對換並結束.

  4. 完成如上的操作,列印輸出陣列發現:資料變得相對有序了,就是在陣列中key值座標前面的都是小於key,key值座標後面的都是大於key值得,

  5. 所以大家明白了:將以key值為座標的陣列拆分成2個陣列,分別去執行123步驟操作,最終就會產生一個有序陣列


演算法如下

/**
  * 
 * @Description: 
 * @author:cuiyaonan2000@163.com
 * @date 2014年11月5日 下午1:02:45
  */
 public static void quickSort(int[] array,int begin,int end){
  int theKey = array[begin];   //設定關鍵值
  int i = begin;
  int j = end;
  while(true){
   while(i<j && array[j] >= theKey)   //從後面找到一個比關鍵之小的數字座標
    j-- ;
   if(i<j){  //交換
    int temp = array[j];
    array[j] = array[i];
    array[i] = temp;
   }else{
    break;
   }
   while(i<j && array[i] <= theKey)   //從前面找到一個比關鍵之大的數字座標
    i++;
   if(i<j){ //交換
    int temp = array[j];
    array[j] = array[i];
    array[i] = temp;
   }else{
    break;
   }
  }
  
  if(--i > begin ){//這個表示一直找到 被拆分的陣列中只有一個值.否則遞迴呼叫
   quickSort(array,begin,i);
  }
  if(++j< end){ //這個表示一直找到 被拆分的陣列中只有一個值.否則遞迴呼叫
   quickSort(array,j,end);
  }
 }

 



相關文章