快速排序的簡易實現

package com.joker.suanfa;

public  class QuickLySort {
/**快速排序  如果是按照從小到大進行排序,那麼最後的結果應該是大的數字在右邊,小的數字在左邊。
* 實質步驟:1 選取一個基準值(如第一位source[0],然後從右往左(j=source的長度,j--)開始查找,發現小於基準的值之後,就停下來,定位到這一點
*          2 從左到右開始循環(i=0,i<j  i<j是爲了保證同一段數據只循環一次)查找發現大於基準值之後就停下來
*          此時有兩種可能,一個是i=j,一個是i<j,
*          i=j,表示這一段數據已經遍歷完了,那麼,交換基準值和i當前的位置的值就完成了這一段數據的排序,如:int[]{3,1,2,5,4}
*          i<j,表示這一段數據還沒遍歷完,那麼此時,需要交換i和j的值,並繼續排序,直到i和j相同(碰頭)如 : int[]{3,1,2,4,5,2,4};
* @param source 需排序的數據
* @param left 左邊開始查找位
* @param right 右邊開始查找位
*/
public static void quick_sort(int source[], int left, int right)  
{  
  if(left>right){
  return;
  }
  int base = source[left];
  int i =left;
  int j = right;
  while(i!=j){
  while(source[j]>=base&&i<j){
  j--;
  }
  while(source[i]<=base&&i<j){
  i++;
  }
  if(i<j){
  int temp =source[i];
  source[i]=source[j];
  source[j]=temp;
  }
  }

  //碰頭的時候,表示整個數據已經遍歷完了,這個時候將碰頭的值和基準值(第一位)交換,則可以得到由基準值一分爲二的數組,基準值前面的數小於基準值
  //基準值後面的數,大於基準值
  source[left] =source[i];
  source[i]=base;
  //i的位置上的值就是基準值,已經排好序,故只需要處理餘下的兩個部分
  quick_sort(source, left,i-1);
  quick_sort(source, i+1, right);
}  
public static void main(String[] args) {
int s [] = new int[]{3,1,2,5,4};
// int s [] = new int[]{3,1,2,4,5,2,4};
quick_sort(s,0,s.length-1);
for(int i=0;i<s.length;i++){
System.out.println(s[i]);
}
}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章