1. 程式人生 > >java中的快速排序

java中的快速排序

我們先來舉列子瞭解一下快速排序:


如圖,我們以隊伍第一個元素為基準,然後我們從後面找比基準大的值後,將他的值

放到基準的位置(注意 原位置還是他的值)

一次後:


第二次:


第三次:


第四次:


最後一次:


當兩邊的指標重合時,將基準放的那個位置,然後一次快速排序結束,

結束後的結果是,基準左側,全是比他小的,基準右側全是比他大的。

而遞迴就是一次快速排序後,兩邊遞迴子序列快排,函式實現:

public static int partio1(int []array,int low,int high ){
		int tmp = array[low];
		while(low<high){
			
			while(low<high&& array[high]>=tmp){
				--high;
			}
			if(low >=high){
				break;
			}else{
				array[low] = array[high];
			}
			while(low<high&&array[low]<=tmp){
				++low;
			}
			if(low>=high){
				break;
			}else{
				array[high] =array[low];
			}
		}
		array[low] = tmp;
		return low;
	}
	public static void Quick(int array[],int start,int end){
		int par = partio1(array,start,end);
		if(par > start+1){
			Quick(array,0,par);
		}
		if(par <end-1){
			Quick(array,par+1,array.length-1);
		}
	}
	public static void Quicksort(int array[]){
		Quick(array,0,array.length-1);
	}

非遞迴:


這是一次快排後的結果,我們將,基準兩側控制範圍的下標入棧。


0到4是基準左側的下標範圍,6到8是基準右側的下標範圍,然後讓8和6出棧,對這

個範圍的子問題快排,如若大於一個元素,繼續入棧,知道有序,類似遞迴,再讓右

邊有序,最終使得序列有序。

程式碼:

public static int partion(int[] array,int low,int high){
		int point = array[low];
		while(low < high){
			while(low < high && array[high] >= point){
				high--;
			}
			if(low >= high){
				break;
			}else{
				array[low] = array[high];
			}
			
			while(low < high && array[low] <= point){
				low++;
			}
			if(low >= high){
				break;
			}else{
				array[high] = array[low];
			}
		}
		array[low] = point;
		return low;
	}
	public static void Quicks(int[] array){
		int[] stack = new int[array.length];
		int top = 0;
		int low = 0;
		int high = array.length-1;
		int par = partion(array,low,high);
		//入棧
		if(par > low+1){
			stack[top++] = low;
			stack[top++] = par-1;
		}
		
		if(par < high-1){
			stack[top++] = par+1;
			stack[top++] = high;
		}
		
		//出棧
		while(top > 0){
			high = stack[--top];
			low = stack[--top];
			
			par = partion(array,low,high);
			if(par > low+1){
				stack[top++] = low;
				stack[top++] = par-1;
			}
			if(par < high-1){
				stack[top++] = par+1;
				stack[top++] = high;
			}
		}
	}