Java Quicksort
public class QuickSort {
/**
* 将数据按照基准数自大小进行左右划分
*
* @param a
* @param start
* @param end
* @return
*/
public static int divide(int[] a, int start, int end){
//便利每次都以最右边的元素作为基准值
int base = a[end];//第一循环 6
//start一旦等于end,就说明左右两个指针合并到了同一位置,可以结束此轮循环。
while(start < end){
while(start < end && a[start] <= base)
//从左边开始遍历,如果比基准值小,就继续向右走,寻找左边第一个大于基准值的数与基准值做调换
start++;
//上面的while循环结束时,就说明当前的a[start]的值比基准值大,应与基准值进行交换
//第一循环 左边第二位时候7比6大 循环节点 start右移动一位 {2,7,4,5,10,1,9,3,8,6}
if(start < end){
//交换
int temp = a[start];
a[start] = a[end];
a[end] = temp;
//交换后,此时的那个被调换的值也同时调到了正确的位置(基准值右边),因此右边也要同时向前移动一位
end--;
//第一循环 {2,6,4,5,10,1,9,3,8,7} 开始右边比对{4,5,10,1,9,3,8}与6的大小,找比6小的做交换
}
while(start < end && a[end] >= base)//第一循环 start=1 end=8 8>6?
//从右边开始遍历,如果比基准值大,就继续向左走
end--;
//上面的while循环结束时,就说明当前的a[end]的值比基准值小,应与基准值进行交换
//第一循环 end=7时 a[end]=3 循环结束
if(start < end){
//交换
int temp = a[start];
a[start] = a[end];
a[end] = temp;
//交换后,此时的那个被调换的值也同时调到了正确的位置(基准值左边),因此左边也要同时向后移动一位
//开始6与3交换 {2,3,4,5,10,1,9,6,8,7}
start++;
}
}
//这里返回start或者end皆可,此时的start和end都为基准值所在的位置,即基准值在中间的时候。
return end;
}
/**
* 排序
* @param a
* @param start
* @param end
*/
public static void sort(int[] a, int start, int end) {
if (start > end) {
//start=end 一个元素,结束循环
return;
} else {
//如果不止一个元素,继续划分两边递归排序下去
int partition = divide(a, start, end);
sort(a, start, partition - 1);
sort(a, partition + 1, end);
}
}
public static void main(String[] args) {
int[] a = new int[]{2,7,4,5,10,1,9,3,8,6};
sort(a, 0, a.length-1);
System.out.println("排序后的结果:");
for(int x : a){
System.out.print(x+" ");
}
}
https://arxiv.org/pdf/1511.01138.pdf