1. 程式人生 > >快速排序挖坑法理解與實現

快速排序挖坑法理解與實現

自己實現的程式碼如下

package sort;

/*快速排序
 * 簡單理解為找位置排序,每趟排序都為閾值pivot找到其該放的位置,即其左邊的全都<=pivot,其右邊的全都>pivot;
 * 然後對左右兩邊分別遞迴執行之前的步驟;
 * 1 low < high 才需要排序,這個同時也是繼續遞迴的條件,若沒有則會導致無線遞迴;
 * 2 下標R=low,L=high, 確定閾值pivot,這裡使用陣列的第一個元素array[low],pivot = array[low].賦值後low位置(也就是R)可以看做已空,虛位以待
 * 3 以下所有操作都是在R < L的情況下才繼續進行,若R=L則找到了pivot在陣列中真正應該放的位置
 * 4 從後往前找到 <= pivot的值,將其放在array[R]
 * 5 從前->後,找到>pivot的值,將其放在array[L]
 * 6 當R=L則找到了pivot在陣列中真正應該放的位置。array[R] = pivot;
 * 7 分別對array[R]左右兩邊的序列做同上的操作,即遞迴
 * */
public class QuickSort {
	public static void quickSort2(int[] array,int low,int high){
		try{
			if(low < high){ //排序條件,也是遞迴條件
				int R = low,L = high;
				int pivot = array[R];//挖出R位置的值,放入pivot
				//當R=L時表示找到pivot在陣列中真正應該放的位置。array[R] = pivot
				while(R < L){
					//前<-後,從後往前找 <= pivot的值放入R
					while(R < L && array[L] > pivot ){
						L--;
					}
					if(R < L ){
						array[R] = array[L];
					}
					
					//前->後,從前往後找到大於pivot的值,存入L
					while(R <L && array[R] <= pivot){
						R++;
					}
					if(R < L){
						array[L] = array[R];
					}
				}
				array[L] = pivot;
				quickSort2(array,low,L - 1);
				quickSort2(array,L + 1,high);
			}
		
		}
		catch(Exception e){
			e.printStackTrace();
		}
	}
	
	
	
	//將閾值pivot放到正確的位置上,即左邊元素<=閾值pivot,右邊>閾值pivot
	public static void quickSort(int[] array,int low,int high){
		try{
		if(low < high){ //這裡是做什麼用?沒有的話high會變成-1
			int position = low;//閾值的初始位置為low,即取第一個元素作為閾值。
			int pivot = array[position];//取出pivot,使position空出來
			int  R = low,L = high;
			while(R < L){
				//從後往前找到 <=pivot 的元素,放在R上
				while(R != L && array[L] > pivot){
					L--;
				}
				if(R < L){
					array[R] = array[L];
					R++;
				}
				
				
				//從前往後找 >pivot 的元素,放在L上,因為L的位置已空出來
				while( R != L && array[R] <= pivot){
					R++;
				}
				if(R < L){
					array[L] = array[R];
					L--;
				}
				
				
			}
			
			array[L] = pivot;//找到pivot的正確位置
			quickSort(array,low,L - 1);//對左邊繼續遞迴
			quickSort(array,L + 1,high);//對右邊繼續遞迴
			//return R;
		}
		}
		catch(Exception e){
			
			e.printStackTrace();
		}
	}
	
	
	public static void main(String[] args) {
		int[] array = {72,6,57,88,60,42,83,73,48,85};
		int[] array2 = {72,6,57,88,60,42,83,73,48,85};
		
		quickSort(array,0,array.length - 1);
		
		for(int i :array){
			System.out.print(i + ",") ; 
			//System.out.print(i + ',') ; //--> 使用單引號會導致 加上字元,的int值
		}
		System.out.println() ; 
		quickSort2(array2,0,array.length - 1);
		for(int i :array){
			System.out.print(i + ",") ; 
			//System.out.print(i + ',') ; //--> 使用單引號會導致 加上字元,的int值
		}
		
	}

}