快速排序
快速排序逻辑
快速排序采用分治法的思想,每次找到一个数的正确位置,并将左右两侧调整为小于大于该数的两部分,递归两侧找到每一个数字的正确位置
在交换过程中,相同大小的元素可能会改变它们的相对顺序,所以快速排序不稳定
复杂度分析
平均时间复杂度:O(nlogn)
空间复杂度:O(logn)
最差情况的时间复杂度,待排序数组已经是有序的或者逆序的,此时每次划分只能得到一个很小或很大的子数组,其时间复杂度为O(n^2);
递归调用栈的最大深度为n,因此最坏情况下的空间复杂度为O(n)
代码实现
class Main {
public static void quickSort(int[] arr, int left, int right) {
// 保证数组存在值
if(left < right) {
int temp = arr[left];
int i = left + 1, j = right;
// 左右指针,找到左边第一个大于temp的和右边第一个小于temp的,交换
while(i <= j) {
while(i <= j && arr[i] < temp) i++;
while(i <= j && arr[j] > temp) j--;
if(i <= j) {
swap(arr, i, j);
i++;
j--;
}
}
// 将第一个值放到合适的位置
swap(arr, left, j);
// 左右区间分别快排
quickSort(arr, left, j-1);
quickSort(arr, i, right);
}
return;
}
public static void swap(int[] arr, int n, int m) {
int temp = arr[n];
arr[n] = arr[m];
arr[m] = temp;
}
}
使用场景
快速排序适用于各种规模的待排序数组,它的性能好于其他排序算法,尤其适用于大规模数据的排序。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 IT蛋的个人博客!