该你改的你看看不行我再给你改应该没问题
import java.util.Random;
public class Test1 {
int i = 0; //定义一个整型的i记录排序的次数
public static void main(String[] args) {
Test1 T = new Test1();
//int[] arr={3,4,5,6,1,1,7};//下面getMiddle中的arr[end]>key会出现死循环,你的是arr[end]>arr[key]
int[] arr = {49,38,65,97,78,13,27,1,2};
// int[] arr = { 49, 38, 65, 97, 78, 13, 27, 12, 11 }; //实例化一个数组
System.out.println("初始化数组为:");
printArray(arr); //把数组打印出来
T.Run(arr, 0, arr.length - 1); //开始排序
}
public void Run(int[] arr, int begin, int end) { //一个递归,不断的对数组进行排序
if (begin < end) { //只有开始索引比结束索引小的时候才进行排序
/*你这中间值也用KEY太蒙人,是不是应该换个*/
int key = getMiddle(arr, begin, end); //进行排序并返回中间值的位置
Run(arr, begin, key - 1); //对中间的左边进行递归
Run(arr, key + 1, end); //对中间的右边进行递归
}
}
public int getMiddle(int[] arr, int frist, int last) {
int begin = frist; //开始索引等于数组第一个下标
int end = last; //结束索引等于数组长度减一
//int key = frist; //基准数的索引等于数组的第一个索引
int key = arr[frist];
while (begin < end) { //每当开始索引小于结束索引的时候都不断的排序
//while (begin < end && arr[end]>arr[key]) { //从数组的结束索引开始不断向前找,直到找到一个比基准数小的数位置,然后进行交换
while (begin < end && arr[end]>=key) {//不加等号会出现死循环,例如一个数组中有相等的值
end--; //找不到就向前走
//没必要出现这句
/*if (end == key) { //如果结束索引等于开始索引了,那就要结束循环
break;
}*/
}
//swap(arr, key, end); //找到了,就交换数据,并返回基准数交换后的索引
swap(arr,begin,end);//你上面的传值是啥意思,为什么要和标志位换呢,是不是应该像我这样,感觉你的快排的原理和我的不大一样
/*
i++; //每次交换都统计次数
System.out.println("第" + i + "次结果为");
printArray(arr); //输出这次交换后的数组*///到这不是本次的最终结果,也许你的结果和我的不是一个意思,判断一次结果是标志的值发生变化才算一次结果
while (begin < end && arr[begin]<=key) {//从数组开始不断向后找,直到找到一个比基准数大的数,交换位置
begin++; //找不到就向后走
/* if (begin == key) { //如果前后两个索引相等,就要结束循环
break;
}*/
}
//swap(arr, key, begin); //找到了,就交换数据,并返回基准数交换后的索引
swap(arr, end, begin);
/*
i++;
System.out.println("第" + i + "次结果为");
printArray(arr);*/
/*if (begin == end || begin > end) { //如果前后索引相等或者前面的比后面的大,都要结束循环
break;
}没必要*/
}
i++;
System.out.println("第" + i + "次结果为");
printArray(arr);//输出一次结果
return begin; //返回中间数的索引
}
private void swap(int[] arr, int key, int x) {
int temp = arr[x];
arr[x] = arr[key];
arr[key] = temp;
// return x; //比较后,要返回基准数新的索引
}
private static void printArray(int[] arr) {
for (int j : arr) { // 遍历输出数组的值
System.out.print(j + " ");
}
System.out.println(); // 换行
}
}
撑不住了,看得有点晚睡了,不行你再给我huitie明天接着给你搞,不出意外应该没问题 |