1.例题源码
public static void main(String[] args) {
//快速排序
int[] num = {20,40,32,67,40,20,89,300,400,15};
sort(num,0,num.length-1);
for (int i : num) {
System.out.print(i + " ");
}
}
public static void sort(int[] num, int min ,int max){
//索引越界 跳出
if(min > max){
return;
}
int i =min;
int j =max;
//将第一个数子作为参考数字
int first = num[min];
int temp;
while (i<j) {
//先看右边,依次往左递减
while (first<=num[j]&&i<j) {
j--;
}
//再看左边,依次往右递增
while (first>=num[i]&&i<j) {
i++;
}
//如果满足条件则交换
if (i<j) {
temp = num[j];
num[j] = num[i];
num[i] = temp;
}
}
//将i j 相等时的数字座位基准数字
num[min] = num[i];
//将基准数字 与 i j 相等时位置上的数字交换
num[i] = first;
//递归调用排序左边
sort(num,min, j - 1);
//递归调用排序右边
sort(num,j+1,max);
}
排序的结果:15 20 20 32 40 40 67 89 300 400
2.我所遇到的问题(我是初学菜鸡)
快速排序的步骤:
- 假设第一位为基准数(参考的数字)
- 从数组的最右边开始查找(j),找的是比基准数字小的数字(ps:如果是从小到大排列的话)
- 从数组的最左边开始查找(i),找的是比基准数字大的数字(ps:如果是从小到大排列的话)
- 交换两个找的数字, 继续循环交换两位数字直到 i = j 时,将此时i位置上对应数字作为基准数字,交换上一位基准数字和此时i位置上对应的数字。
- 递归调用重复以上的步骤
我的问题:
while (first<=num[j]&&i<j) { j--; } //不是应该从右边开始找的是小于基准数字的数吗这里为什么写 <= 呢? 经过Debugger后,原来是大于基准数数就不会进入循环(哈哈哈)这里的j就不会发生变化,就能 找到小于基准数字的数
问题总结:是我没有理清快速排序当(i<j)时while循环内部的运行流程 emo---.