排序算法 Java编程问题 小结

快排

遇到的问题:

通过断点调试 发现主要的问题是在第二递归时的if判断语句条件不对,看了 这篇博客的条件判断才发现问题所在。第一个判断语句不应该是l>1,而是左指针大于左边界lchild.完整的快排Java代码如下:

package Sort;

import java.util.Arrays;

public class QuickSort {
	public static void main(String args[]) {
		int arr[]= {33,2,3,4,6,1,34,21,45,25,76,81,18};
		
		  sort(arr,0,arr.length-1);
		System.out.println(Arrays.toString(arr));
	}
  public  static void sort(int arr[],int lchild,int rchild) {//为什么这里非要static修饰呢?
	  /*第一步 建立枢纽
	   * 第二步  设置方向
	   * 第三步  l r 分别为左右指针  lchild rchild分别表示左右边界
	   * */   
	  int l = lchild;
	  int r = rchild;
	  
	  int temp = arr[l];//待调整的元素,每一次将左边界值作为枢纽
	  int direction = 0;//表从右开始;
	  while( r != l ) {
		  if(direction == 0) {
			  if(r>lchild && arr[r]<temp  ) {
				  arr[l]=arr[r];
				  direction = 1;
			  }else r--; 
		  }else {
			  if(l<rchild && arr[l]>temp) {
				  arr[r] = arr[l];
				  direction = 0;
			  }else l++;
		  }
	  }
	  arr[l] = temp;//每一步的操作都是交换位置,这一步有必要吗?有,因为每次交换位置之后都是都是值大的替代了前一位,所以在数组在单轮调整完全之前都会有两个值相同。故待调整的元素会被覆盖,将提前存好的待调元素放在左右指针相汇的位置。
	  
	
	 
 	  if(l>lchild) {//注意这里不是l>1 ,而是左指针大于左边界
 		  
 		 sort(arr,lchild,l-1);
 	  }
 	  if( rchild-r >1) {
 		 sort(arr,r+1,rchild); 
 	  }
	  
  }
  
}
经验分享 程序员 微信小程序 职场和发展