快速排序
- 不稳定
- 最好:O(n*log N)
- 最坏:O(n^2)
- 单边循环
- 双边循环
单边循环实现
package Sort;
import java.util.Arrays;
public class QuickSort2 {
public static void main(String[] args) {
int[] arr=Number.getArr(10);
System.out.println(Arrays.toString(arr));
sort(arr,0,arr.length-1);
System.out.println(Arrays.toString(arr));
}
public static void sort(int[] arr,int left,int right) {
if (left>=right) {
return;
}
int p= partition(arr, left, right);
sort(arr, left, p-1);//左分区
sort(arr, p+1, right);//右分区
}
public static int partition(int[] arr,int left,int right) {
int pivot=arr[right];//基准值
int i=left;
int temp=0;
for (int j = left; j <right; j++) {
if (arr[j]<pivot) {
temp=arr[j];
arr[j]=arr[i];
arr[i]=temp;
i++;
}
}
//交换基准值
temp=arr[i];
arr[i]=arr[right];
arr[right]=temp;
return i;//基准值索引
}
}
双边循环实现
package Sort;
import java.util.Arrays;
public class QuickSort3 {
public static void main(String[] args) {
int[] arr=Number.getArr(10);
System.out.println(Arrays.toString(arr));
sort(arr,0,arr.length-1);
System.out.println(Arrays.toString(arr));
}
public static void sort(int[] arr,int left,int right) {
if (left>=right) {
return;
}
int p= partition(arr, left, right);
sort(arr, left, p-1);//左分区
sort(arr, p+1, right);//右分区
}
public static int partition(int[] arr,int left,int right) {
int pivot=arr[left];//基准值
int i=left,j=right;
int temp=0;
while (i<j) {
//j从右开始找小的
while (i<j && arr[j]>pivot) {
j--;
}
//i从左开始找大的
while (i<j && arr[i]<=pivot) {
i++;
}
temp=arr[j];
arr[j]=arr[i];
arr[i]=temp;
}
//交换基准值
temp=arr[i];
arr[i]=arr[left];
arr[left]=temp;
return i;//基准值索引
}
}