【实现1】(需要开辟额外的空间)
public class QuickSort {
private QuickSort(){}
public static <E extends Comparable<E>> void sort(E[] arr){
E[] temp = (E[])new Object[arr.length];
sort(arr,0,arr.length-1,temp);
}
public static <E extends Comparable<E>> void sort(E[] arr,int l,int r,E[] temp){
if(l >= r) return;
//返回p的索引位置
int p = partition(arr,l,r,temp);
// 对 arr[l,p-1]进行排序
sort(arr,l,p-1,temp);
//对 arr[p+1,r]进行排序
sort(arr,p+1,r,temp);
}
//将 p 放在合适的位置 使左边的都比 p 小,右边的都比 p 大
public static <E extends Comparable<E>> int partition(E[] arr,int l,int r,E[] temp){
System.arraycopy(arr,l,temp,l,r-l+1);
//设置大于部分 和 小于部分的开始索引
int i = l ,j = r;
//找到p的值
E p = arr[l];
for(int k = l + 1; k <= r; k++){
if(temp[k].compareTo(p) > 0){
arr[i] = temp[k];
i++;
}else{
arr[j] = temp[k];
j--;
}
}
return i + 1;
}
public static void main(String[] args) {
int n = 1000000;
SortingHelper.sortTest2("QuickSort",n);
}
}
【实现2】(原地进行排序)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7hLy9cCE-1610469610859)(037996B08904400DADD2A5938502C417)]
public class QuickSort {
private QuickSort(){}
public static <E extends Comparable<E>> void sort(E[] arr){
sort(arr,0,arr.length-1);
}
public static <E extends Comparable<E>> void sort(E[] arr,int l,int r){
if(l >= r) return;
//返回p的索引位置
int p = partition(arr,l,r);
// 对 arr[l,p-1]进行排序
sort(arr,l,p-1);
//对 arr[p+1,r]进行排序
sort(arr,p+1,r);
}
//将 p 放在合适的位置 使左边的都比 p 小,右边的都比 p 大
public static <E extends Comparable<E>> int partition(E[] arr,int l,int r){
//把数组分为 arr[l] | arr(l+1,j) | arr(j+1,i-1) | arr[e] | arr(e+1,r) 的形式
//初始化 j 的索引,
int j = l;
for (int i = l + 1; i <= r; i++) {
if(arr[i].compareTo(arr[l]) < 0){
j++;
swap(arr,i,j);
}
}
swap(arr,l,j);
return j;
}
public static <E extends Comparable<E>> void swap (E[] arr,int i,int j){
E temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
public static void main(String[] args) {
int n = 1000000;
SortingHelper.sortTest("MergeSort",n);
SortingHelper.sortTest("QuickSort",n);
}
}