关于快速排序,基准数出错的问题!
注意就是在找基准数的左右部分 必须先end 再start的顺序 ,不然会出错,不过还有补救措施!!
package paixusaunfa;
import java.util.Random;
import demo11.random;
public class 快速排序 {
public static void main(String[] args) {
/*
快速排序:
第一轮:以0索引的数字为基准数,确定基准数在数组中正确的位置。
比基准数小的全部在左边,比基准数大的全部在右边。
后面以此类推。
*/
// TODO Auto-generated method stub
int[] arr={6,1,2,7,9,3,4,5,10,8};
quickSort(arr,0,arr.length - 1);
for(int i=0;i<arr.length;i++) {
System.out.print(arr[i]+" ");
}
}
public static void quickSort(int[] arr,int i,int j) {
int start = i;
int end = j;
if(start>=end) return;//递归出口
int temp = arr[i];
while(start!=end) {
//!!!!!!注意必须先end 再start ,不然会出错,不过还有补救措施
while(true) {
if(arr[end]<temp||end<=start) {
break;
}
end--;
}
while(true) {
if(arr[start]>temp||end<=start)
{
break;
}
start++;
}
int temp1 = arr[start];
arr[start] = arr[end];
arr[end] =temp1;
}
//当start和end指向了同一个元素的时候,那么上面的循环就会结束
//表示己经找到了基准数在数组中应存入的位置
//基准数归位
//就是拿着这个范围中的第一个数字,跟start指向的元素进行交换
int temp2 = arr[i] ;
arr[i] = arr[start];
arr[start] = temp2;
//确定6左边的范围,重复刚刚所做的事情
quickSort(arr,i,start-1);
//确定6右边的范围,重复刚刚所做的事情
quickSort(arr,start+1,j);
}
}
下面是先start 再end的补救措施!便是调整递归体部分的基准数的位置。
如 荧光笔的部分是修改基准数的解决方法。
溢出的话可能就是递归出口的范围出问题了。以下便是我自己修改后可运行的。
就是这里对start要大于等于。
希望对某些博友有用。菜鸟第一次写博客如果觉得有用能够解决问题 麻烦给小弟点个赞留个反馈哦!