快速排序-part2
快速排序-part2
快速排序是一种基于比较的排序算法,利用分治法来将一个序列分割成两个子序列进行排序,并利用递归的方式进行排序。快速排序是一种高效的排序算法,其时间复杂度为O(nlogn),空间复杂度为O(logn)。
【算法步骤】
1.选择基准值:从数列中选择一个元素作为基准值(pivot)。
2.分割:将序列中大于基准值的元素放在基准值的右边,小于基准值的元素放在基准值的左边。此时,基准值的位置已经确定了。
3.递归:对左右两边的子序列分别重复步骤1、步骤2,直到每个子序列只有一个元素时终止递归。
【时间复杂度】
- 最好情况下,每次选出的基准值都刚好平分整个序列,此时排序效率最高,时间复杂度为O(nlogn)。
- 最坏情况下,每次选出的基准值总是序列中的最小或最大值,导致递归树退化成只有一条支线,此时时间复杂度为O(n²)。
- 平均情况下,快速排序的时间复杂度为O(nlogn)。
【空间复杂度】
快速排序的空间复杂度为O(logn),主要是由于递归调用的栈所占用的空间。
【适用场景】
快速排序适用于数据量较大、数值分布比较均匀的情况下。由于快速排序对于数据分布的依赖性比较强,如果数据分布不均匀,可能会影响排序效率,甚至导致时间复杂度退化到O(n²)。因此,如果要在数据分布不均匀的情况下进行排序,建议采用其他排序算法。
【实现代码】
以下是实现快速排序的Java代码:
Copy Codepublic static void quickSort(int[] arr, int low, int high) {
if (low < high) {
int pivot = partition(arr, low, high);
quickSort(arr, low, pivot - 1);
quickSort(arr, pivot + 1, high);
}
}
private static int partition(int[] arr, int low, int high) {
int pivot = arr[high];
int i = low - 1;
for (int j = low; j <= high - 1; j++) {
if (arr[j] < pivot) {
i++;
swap(arr, i, j);
}
}
swap(arr, i + 1, high);
return i + 1;
}
private static void swap(int[] arr, int i, int j) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
其中,quickSort方法是快速排序的入口,它会递归调用自己对左右子序列进行排序。partition方法是分割方法,用于将序列分割成两个子序列,并返回基准值的位置。swap方法是交换数组中两个元素的值。
测试代码如下:
Copy Codeint[] arr = {5, 3, 1, 6, 8, 4, 2, 7};
quickSort(arr, 0, arr.length - 1);
System.out.println(Arrays.toString(arr));
输出结果为:[1, 2, 3, 4, 5, 6, 7, 8]
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 IT蛋的个人博客!

