public class QuickSort {
public static void quickSort(int[] arr,int low,int high){
if(low>high){ // 如果low>high则退出
return;
}
int i=low; // i从数组最左端向右查找比基准数大的值
int j=high; // j数组最右端向左查找比基准数小的值
int temp = arr[low]; // temp就是基准数,首先基准数设置为数组最左边的值
while (i<j) {
while (temp<=arr[j]&&i<j) { // 先看右边,依次往左递减
j--;
}
while (temp>=arr[i]&&i<j) { // 再看左边,依次往右递增
i++;
}
if (i<j) { // 如果满足i<j条件则交换ij位置
int t = arr[j];
arr[j] = arr[i];
arr[i] = t;
}
}
arr[low] = arr[i]; // 最后将基准数与i和j相等的位置的数字交换
arr[i] = temp;
quickSort(arr, low, j-1); // 递归调用处理基准数左半数组
quickSort(arr, j+1, high); // 递归调用处理基准数右半数组
}
public static void main(String[] args){
int[] arr = {10,7,2,4,7,62,3,4,2,1,8,9,19}; // 创建数组arr
quickSort(arr, 0, arr.length-1); // 调用快速排序函数quickSort,入参为数组arr、低位、高位
for (int i = 0; i < arr.length; i++) { // 输出已排序数组
System.out.print(arr[i]+" "); // System.out.println(arr[i]);
}
}
}
运行结果
快排步骤
- 假设数组为[10,7,2,4,7,62,3,4,2,1,8,9,19],对它进行快排
- 令low=i=10,high=j=19,基准数为low
- j先从右向左寻找比基准数小的数j–,i再从左向右寻找比基准数大的数i++
- 交换i和j
- 继续进行3步骤的操作,交换i和j,直到i=j
- 这时候交换基准数和i=j的数,会发现基准数左侧均比基准数小,右侧均比基准数大,但是左右均为乱序
- 对基准数左侧右侧进行递归快排的调用,直至排序完成
时间复杂度
快排的时间复杂度和冒泡排序类似,应用了二分的思想,最坏的时间复杂度为O(N2),平均时间复杂度为O(NlogN)