介绍
快速排序(Quicksort)是一种基于分治策略的高效排序算法
⭐基本思想:是选择一个“基准”元素(pivot),然后将数组分成两部分:一部分的所有元素都小于等于基准,另一部分的所有元素都大于基准。这个过程被称为分区操作(partition)。接下来,递归地对这两部分进行相同的操作,直到整个数组有序。
⏩步骤:
选择基准:从数组中选择一个元素作为基准。这可以是数组中的第一个元素、最后一个元素、中间元素,或者是随机选择的元素。
分区操作:重新排列数组,使得所有比基准小的元素放在基准前面,所有比基准大的元素放在基准后面(相等的元素可以在任一边)。在这个分区结束之后,该基准就处于其最终的位置。
递归排序子数组:递归地将较小元素的子数组和较大元素的子数组排序。
public static int partition(int[] array, int low, int high) {
// 选择最后一个数作为基准
int pivot = array[high];
// 定义了一个pointer变量,它指向分区后应该放置小于等于pivot值的位置,初始为low
int pointer = low;
// 从 low 开始遍历到 high - 1, 如果当前元素小于或等于pivot,则将该元素与pointer位置的元素互换,并将pointer向前移动一位。
// 这一步确保了所有小于等于pivot的元素都被移到了pointer左侧。
for (int i = low; i < high; i++) {
if (array[i] <= pivot) {
int temp = array[i];
array[i] = array[pointer];
array[pointer] = temp;
pointer++;
}
System.out.println(Arrays.toString(array));
}
// 遍历完后pointer左边的都是小于等于pivot,右边的(包括pointer)都是大于pivot,此时应该将pivot和pointer交换,使得pivot移到正确位置
int temp = array[pointer];
array[pointer] = array[high];
array[high] = temp;
return pointer;
}
public static void quickSort(int[] array, int low, int high) {
if (low < high) {
int position = partition(array, low, high);
quickSort(array, low, position - 1);
quickSort(array, position + 1, high);
}
}
算法分析:
稳定性:不稳定
时间复杂度:
最佳:O(nlogn)
最差:O(n2):这种情况发生在每次选择的基准都是当前数组的最大或最小值,导致每次分区后只减少一个元素。这通常会在已经排序好的数组上发生,如果总是选择第一个或最后一个元素作为基准。
平均:O(nlogn)
空间复杂度:O(logn)
实现图解🖌️
1. 选择基准
选择最后一个数作为基准
定义了一个pointer变量,它指向分区后应该放置小于等于pivot值的位置,初始为low(指向数组最左边位置)
)

2. 遍历重排元素
从 low 开始遍历到 high - 1, 如果当前元素小于或等于pivot,则将该元素与pointer位置的元素互换,并将pointer向前移动一位。
这一步确保了所有小于等于pivot的元素都被移到了pointer左侧。
)

2.1. 遍历步骤

3. 将pivot置于中间
遍历完后pointer左边的都是小于等于pivot,右边的(包括pointer)都是大于pivot,此时应该将pivot和pointer交换,使得pivot移到正确位置

4. 使用递归划分子数组
public static void quickSort(int[] array, int low, int high) {
if (low < high) {
int position = partition(array, low, high);
quickSort(array, low, position - 1);
quickSort(array, position + 1, high);
}
}
类似二分法,position即得到的pivot所在位置,用同样的方法去递归排序[low,position-1]和[position+1,high]直到每个子数组只有一个元素(即low=high)
为了更加清晰的图解,假如第一次partition操作后的排序为[1, 0, 1, 2, 4, 5, 7, 5]
7109

被折叠的 条评论
为什么被折叠?



