特点:
双边排序的步骤和思想:
相关代码:(优化后)
//快速排序(双边循环)
public class QuickSort {
public static void main(String[] args) {
int[] a = {5,3,7,2,9,8,1,4};
partition(a,0,a.length-1);
quick(a,0,a.length-1);
}
public static void quick(int[] a,int l,int h){
if(l >= h){
return;
}
int p = partition(a, l, h);//p 代表索引值
quick(a,l,p-1);//左边分区的范围确定
quick(a,p+1,h);//右边分区的范围确定
}
public static int partition(int[] a, int l, int h) {
int pv = a[l];
int i = l;
int j = h;
while(i < j){
//j 表示从右向左
while (i < j && a[j] > pv){
j--;
}
//i 表示从左向右
while (i < j && a[i] <= pv){
i++;
}
swap(a,i,j);
}
swap(a,l,j);//当i=j时,i或j的索引值和 基准点进行交换
System.out.println(Arrays.toString(a) + "j=" +j);
return j;
}
public static void swap(int[] a,int i,int j){
int t = a[i];
a[i] = a[j];
a[j] = t;
}
}
排序方式的选择:
① 当数据量过大时,快速排序优势大,选择快速排序,最优复杂度为nlogn
② 当数据量小时,且数据是有序的,插入排序优势大,选择插入排序,最优复杂度为n