基础排序:快速排序
算法实现:
- 在排序数组中选择一个数作为基数(我这里选择数组末尾的数)
- 根据基数把数组切为三个部分:1.比基数小的在左边;2.比基数大的在右边;3.跟基数相等的在中间
- 如此分开后,三个小数组整体有序(三个数组只是以下标分开,并不是新建数组)
- 递归左右两个小数组
- 最后得到的数组就是有序的
public class QuickSort {
private void swap(int[] arr,int i,int j){
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
public void quickSort(int[] arr){
if (arr == null || arr.length < 2){
return;
}
quickSort(arr,0,arr.length-1);
}
private void quickSort(int[] arr,int L,int R){
if(L < R){
int[] p = partition(arr,L,R);
//对左边进行递归
quickSort(arr,L,p[0] - 1);
//对右边进行递归
quickSort(arr,p[1] + 1,R);
}
}
//将数组分为三个部分
private int[] partition(int[] arr,int L,int R){
//左边数组的末尾下标
int less = L - 1;
//右边数组的起始下标
int more = R + 1;
//开始比较的数
int cur = L;
//选择的基数
int tem = arr[R];
while(cur < more){
if(arr[cur] < tem){ //左边数组
swap(arr,++less,cur++);
}else if(arr[cur] > tem){ //右边数组
swap(arr,--more,cur);
}else{
cur++; //中间数组
}
}
//返回中间数组的起始下标和末尾下标
return new int[] {less + 1,more - 1};
}
//test
public static void main(String[] args) {
//随机数组
int[] arr = new int[(int) ((100 + 1) * Math.random())];
for (int i = 0; i < arr.length; i++) {
arr[i] = (int) ((100 + 1) * Math.random()) - (int) (100 * Math.random());
}
QuickSort sort = new QuickSort();
sort.quickSort(arr);
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
}
}