快速排序时间复杂度为nlogn
public static void main(String[] args) {
// 原始数据
int[] arr = new int[]{2, 100, 4, 5, 26, 8, 89, 12, 15, 19, 37, 49, 51, 66};
// 将 首尾数据之间的所有数据 进行快速排序
qksort(arr, 0, arr.length - 1);
// 打印排序结果
for(int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + "\t");
}
}
// 封装快速排序方法
public static void qksort(int[] arr, int start, int end) {
// start、end分别接收排序范围的起始索引
if(start < end) {
// 默认选中范围中第一个元素值作为本次循环的判断基准
int base = arr[start];
// 头指针指向的索引
int low = start;
// 尾指针指向的索引
int high = end + 1;
// 开始一轮循环
while(true) {
// 将base从前往后依次与范围中的每一项做大小校验,如果某项大于base,就跳出循环,头指针就是此项的索引
while(low < end && arr[++low] <= base) ;
// 将base从后往前依次与范围中的每一项做大小校验,如果某项小于base,就跳出循环,尾指针就是此项的索引
while(high > start && arr[--high] >= base ) ;
if(low < high) {
// 如果头指针小于尾指针,交换两个指针指向的数据,然后再次进入循环
exchange(arr, low, high);
} else {
// 如果头指针大于尾指针,说明[start, end]范围的数据已全部判断完成,跳出循环
break;
}
}
// 将base和尾指针high指向的数据进行交换,这样以base为中心,就可以截取出来左右两部分小范围
exchange(arr, start, high);
// 对左部分范围进行快速排序,递归
qksort(arr, start, high - 1);
// 对右部分范围进行快速排序,递归
qksort(arr, high + 1, end);
}
}
// 交换两个索引的数据
public static void exchange(int[] arr, int a, int b) {
int temp = arr[a];
arr[a] = arr[b];
arr[b] = temp;
}