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

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值