先声明,这不是原创,只是对代码做个注解,再遇到时方便理解。
原链接在这里:引用--快速排序(详解)
public class KuaiSu {
private void Quick_Sort(int[] arr, int begin, int end){//begin=0,end=arr.length-1;
if(begin > end)//想象[1,2,3]这个数据,最后begin=0,end=-1,结束方法
return;//return结束整个方法
int temp = arr[begin];
int i = begin;
int j = end;
while(i != j){
//这是一个循环,哨兵j不断寻找比基准数小的元素
while(arr[j] >= temp && j > i)//循环体只有一行时,大括号可省略
j--;
//这是一个循环,哨兵i不断寻找比基准数大的元素
while(arr[i] <= temp && j > i)
i++;
/*
* 条件必须是<=和>=,=不能省略
* 比如[5,6,3,5,5,6]这个数组,正确情况下,第一次交换后得到的是
* [3,5(i),6,5,5,6]
* 如果省略了=,第一次交换永远无法结束,永远停留在:
* [5(i),6,3,5,5(j),6]
* 因为i和j无法++和--
* */
if(j > i){
int t = arr[i];
arr[i] = arr[j];
arr[j] = t;
}
}
arr[begin] = arr[i];
arr[i] = temp;
Quick_Sort(arr, begin, i-1);//方法内调用方法,递归。处理基准数左边的排序
Quick_Sort(arr, i+1, end);//处理基准数右边的排序
//对于一个长数组,这里不断递归,难以完全想出来中间的过程
}
public static void main(String[] args) {
int[] arr={1,-3,5,-7,9,-5,8,6,4,2,0};//类型推断
KuaiSu kuaiSu = new KuaiSu();
kuaiSu.Quick_Sort(arr,0,arr.length-1);
System.out.println(Arrays.toString(arr));
}
}
下面的写法更加优雅:
package array;
/**
* 快速排序
* 通过一趟排序将待排序记录分割成独立的两部分,其中一部分记录的关键字均比另一部分关键字小,
* 则分别对这两部分继续进行排序,直到整个序列有序。
*
*/
public class QuickSort{
private static void swap(int[] data, int i, int j) {
int temp = data[i];
data[i] = data[j];
data[j] = temp;
}
private static void subSort(int[] data, int start, int end) {
if (start < end) {
int base = data[start];
int low = start;
int high = end + 1;
while (true) {
while (low < end && data[++low] - base <= 0)
;
while (high > start && data[--high] - base >= 0)
;
if (low < high) {
swap(data, low, high);
} else {
break;
}
}
swap(data, start, high);
subSort(data, start, high - 1);//递归调用
subSort(data, high + 1, end);
}
}
public static void quickSort(int[] data){
subSort(data,0,data.length-1);
}
public static void main(String[] args) {
// int[] data = { 9, -16, 30, 23, -30, -49, 25, 21, 30 };
int[] data=new int[]{1,-3,5,-7,9,-5,8,6,4,2,0};
System.out.println("排序之前:\n" + java.util.Arrays.toString(data));
quickSort(data);
System.out.println("排序之后:\n" + java.util.Arrays.toString(data));
}
}
来源于尚硅谷资料。