快速排序 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而不是<=,又出现了另一个问题,最小值在最左侧,最大值在最右侧(此算法基准值在最左侧),该怎么结束循环,这个坑烦了好久

猜你喜欢

转载自blog.csdn.net/qq_39184715/article/details/81902061