快速排序的簡易實現
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]);
}
}
}
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]);
}
}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.