快速排序详细版
代码都是精品自己撸的,格式没调,需要的自己看看,有收获的
public class QuickSort {
public static void main(String[] args) {
int[] arr = new int[10000];
for(int i=0;i<arr.length;i++) {
arr[i] = (int)(Math.random()*10000 +1);
}
}
//每次都会传递进来一个low和high用来最后继续递归(这是重点)
public static void quickSort(int[] arr,int low,int high) {
int i=low,j=high;
//当最后两个数时,传递进来的参数,low=high 此时不再继续执行
if(i>j) {
return;
}
// i 记录传递进来的首标,j记录尾标,t作为临时变量用来交换值,temp记录基准数 用来最后进行交换位置
int temp=arr[low]; // 这个一定要写在判断后面,否则最后两个数字的时候会溢出报错
while(i<j) {
// 首先从右往左进行查找,必须从右边开始,否则会出现错误
while(arr[j]>temp && j>i) {//在j>i的前提下,一直往左寻找小于基准数的值,找到后j停下
j--;
}
// 开始从左往右查找小于基准数的值
while(arr[i]<=temp && i<j) {
i++; // 找到比temp小的数,或者i=j的时候停下来
}
//此时进行判断,如果i<j ,则代表没有碰面,交换i j的值,然后继续循环继续搜索
if(i<j) { // 只要i与j不相等,就证明没有碰面,没有碰面就继续交换值
arr[i] = arr[i]^arr[j];
arr[j] = arr[i]^arr[j];
arr[i] = arr[i]^arr[j];
}
}
//如果上述循环结束证明i与j已在同一个索引位置,此时基准数与i对应的数字进行交换位置
arr[low] = arr[i]; // low代表的是最初i的位置,也就是首位 每次都会根据上一次传递进来的low和high进行分割
arr[i] = temp;
// 此时一轮的交换已经结束,基于low和high的一次排序已经完场,基准数左边的都是小于基准数的
//基准数右边的都是大于基准数的
// 现在进行递归,依据现在基准数的位置进行分割,两个权健分别为 low - j-1, j+1-high;(这里要重点去体会两个区间)
//这里很关键,因为每次的low和high都会根据上次进行分割,我觉只需要记住每次只是将一个数字放到了正确的位置就很好理解了
//然后根据上一次的基准数再进行分割
quickSort(arr,low,j-1);
quickSort(arr,j+1,high);
}
}