java中的快速排序

我们先来举列子了解一下快速排序:

java中的快速排序_第1张图片

如图,我们以队伍第一个元素为基准,然后我们从后面找比基准大的值后,将他的值

放到基准的位置(注意 原位置还是他的值)

一次后:

java中的快速排序_第2张图片

第二次:

java中的快速排序_第3张图片

第三次:

java中的快速排序_第4张图片

第四次:

java中的快速排序_第5张图片

最后一次:

java中的快速排序_第6张图片

当两边的指标重合时,将基准放的那个位置,然后一次快速排序结束,

结束后的结果是,基准左侧,全是比他小的,基准右侧全是比他大的。


而递归就是一次快速排序后,两边递归子序列快排,函数实现:

public static int partio1(int []array,int low,int high ){
		int tmp = array[low];
		while(low=tmp){
				--high;
			}
			if(low >=high){
				break;
			}else{
				array[low] = array[high];
			}
			while(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 


非递归:

java中的快速排序_第7张图片

这是一次快排后的结果,我们将,基准两侧控制范围的下标入栈。

java中的快速排序_第8张图片

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;
			}
		}
	}

你可能感兴趣的:(java)