什么是快速排序?为什么要有快速排序?怎么实现快速排序?
- 快速排序是一种思想,先找出一个基准数(索引为0的位置) 先循环一次,然后 从右往走找出比基准数小的。然后停止再次从左边走找出比基准数大的 然后停止,交换两数的位置,直到两指针相遇。这样循环一遍后 两指针相遇的地方左边都是比基准数小的 ,右边都是比基准数大的,接着递归 先左右后。
- 开始学习数组的时,冒泡、插入、选择排序作为排序的最基本、最容易理解的排序。但是在数组量增大后 其缺点也显示了出来,时间复杂度为O(n)²,太慢,所有衍生出了一种更快的排序方法:快排
- 代码:这里写出了两路快排 比基准数大和比基准数小的
/**
* @param arr 需要排序的数组
* @param left 需要快排的起始位置
* @param right 需要快排的结束位置
*/
public static void quickSort(int[] arr, int left, int right) {
//left不能比right大
//进行判断 如果right比left大,直接return
if (left > right) return;
//数组不能为空
if (arr == null || arr.length == 0) return;
//定义基准数 数组的最左边
int base = arr[left];
//定义变量i 指向最左边
int i = left;
//定义变量j 指向最右边
int j = right;
//i j 双指针 依次向他们相对的放心走
//当i和j不相遇的时候,依次循环
while (i != j) {
//先由j从右往走 检索比基准数base小的 然后停下
while (arr[j] >= base && i < j) {
j--;
}
//i从左往右,检索比基准数base大的 然后停下
while (arr[i] <= base && i < j) {
i++;
}
//条件成立后 交换i和j的位置的元素
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
//如果while的条件不成立,那么会跳出循环,此时i和j相遇
//相遇后交换基准数和相遇位置的元素交换
arr[left] = arr[i];
arr[i] = base;
//左边的都比base小 右边的都比base大
//然后开始排基准数左边 然后排基准数右边
//左边
quickSort(arr,left,i-1);//i的位置是前一个基准数,不用排序
//右边
quickSort(arr,i+1,right);
}
排序所需时间: