快速排序 Java实现

刚找到以前写的快排,发出来分享一下

package nuc.edu.lisheng;

import java.util.Arrays;
import java.util.Random;

public class QuickSort {
	  public static void main(String[] args) {
		  int [] a= {18,24,68,19,108,27};
		  System.out.println(Arrays.toString(a));
		  System.out.println("------------排序后");
		  //数组是线程安全的,所以无需返回值
			 QucikSortFinal(a);
			 System.out.println(Arrays.toString(a));
	}
	  public static void QucikSortFinal(int [] a) {
		  //初次排序从0开始,到length-1结束
		  int left=0;
		  int right=a.length-1;
		  int standard=a[0];
		  QucikSortProcess(a, standard, left, right);
	  }
	  public static void QucikSortProcess(int [] a,int standard,int left,int right) {
		  //记录初始的左右位置,用以判断排序完成后左右长度,是否进行左右排序
		  int startleft=left;
		  int startright=right;
		  //为基准值寻找合适位置,从右往左扫描,从左往右扫描,一直循环,直到结束
		  A:while(left!=right) {
			  B:for(int i=right;i>=left;i--) {
				  //此处为<,不是<=,如果<=,数组中有相同数字,会出现死循环
				  if(a[i]<standard) {
					  //将i与left的值交换,将right的位置变为i,结束for循环
					  int j=a[i];
					  a[i]=standard;
					  a[left]=j;
					  right=i;
					  break B;
				  }
				  //如果基准值一开始就处于合适的位置,结束循环。防止基准值为最大或最小的数
				  if(i==left) {
					  //结束while循环
					  right=i;
				  }
			  }
			  C:for(int i=left;i<=right;i++) {
				  if(a[i]>standard) {
					  int j=a[i];
					  a[i]=standard;
					  a[right]=j;
					  left=i;
					  break C;
				  }
				  if(i==right) {
					  left=i;
				  }
			  }
		  }
		  //如果左侧有超过一位的数字,对左侧排序
	      if(left-startleft>1) {
	    	  QucikSortProcess(a, a[startleft], startleft, left-1);
	      }
	      //如果右侧有超过一位的数字,对右侧排序
	      if(startright-left>1) {
	    	  QucikSortProcess(a, a[left+1], left+1, startright);
	      }
	  }
	}

运行结果,做过各种情况的测试

当基准值为最值的情况

当出现相同成员的情况

普通情况

问题总结:

需要考虑好有相同值的情况,避免死循环,从而使得a[i]<standard而不是<=,又出现了另一个问题,最小值在最左侧,最大值在最右侧(此算法基准值在最左侧),该怎么结束循环,这个坑烦了好久

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值