快排思想
(1)首先设定一个基准元素,通过该基准元素将数组分成左右两部分。
(2)把这个待排序的序列中小于基准元素的元素移动到待排序的序列的左边,把大于基准元素的元素移动到待排序的序列的右边。经过一轮排序之后,基准元素左边的元素都小于基准元素,基准元素右边的元素都大于或等于基准元素。
(3)然后,对左右分区序列都进行相同方法进行排序,直到各分区只有一个元素为止。
(4)重复这个步骤,就得到一个排好序的数组。
代码实现
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
* 将给定数组排序
* @param arr int整型一维数组 待排序的数组
* @return int整型一维数组
*/
public int[] MySort (int[] arr) {
// write code here
quickSort(arr, 0, arr.length - 1);
return arr;
}
public void quickSort(int[] arr, int i, int j) {
if (i >= j)
return;
int point = arr[i];
int l = i - 1;
int r = j + 1;
while (l < r) {
//从后往前比较,找到比基准值小的
while (arr[--r] > point);
//从前往后比较,找到比基准值大的
while (arr[++l] < point);
if (l < r) {
int t = arr[l];
arr[l] = arr[r];
arr[r] = t;
}
}
quickSort(arr, i, r);
quickSort(arr, r + 1, j);
}
}
复杂性
时间复杂度:
最坏情况下,时间复杂度是O(n^2);
最优情况下,时间复杂度是O(nlogn);
平均时间复杂度是O(nlogn);
空间复杂度:O(logn)
稳定性:不稳定
快速排序的最好情况:
当基准值始终是中间元素或靠近中间元素时。
快速排序的最坏情况:
当选择的基准值是最大或最小的元素时,这种情况导致基准值位于已排序数组的最末端,一个子数组始终为空,而另一个子数组包含元素。