C++ 快速排序
简介
快速排序是一种高效的排序算法,以其速度和简单性而著称。它是基于分治策略,将数组划分为较小的子数组,并递归地对它们进行排序。
步骤
1. 选择枢轴
选择数组中的一个元素作为枢轴。
理想情况下,枢轴应该位于数组中间点附近。
2. 分区
将数组分成两个子数组:
左子数组包含小于或等于枢轴的所有元素。
右子数组包含大于枢轴的所有元素。
3. 递归
对左子数组和右子数组递归地重复步骤 1-2,直到所有子数组排序完成。
详细说明
选择枢轴:
选择枢轴时,通常有三种策略:
第一元素
最后一元素
中位元素(左、中、右元素的中值)
分区:
初始化两个指针:i 指向左子数组,j 指向右子数组。
循环,直到 i 和 j 相遇:
如果 nums[i] <= pivot,则将其留在左子数组中并递增 i。
否则,将 nums[i] 与 nums[j] 交换,并将 j 递减。
递归:
对 [low, i-1] 和 [j+1, high] 范围内的子数组递归地调用快速排序算法。
终止条件:
当子数组只有一个元素时,快速排序终止。
复杂度
平均复杂度:
O(n log n)
最坏复杂度:
O(n^2)(当数组已排序或反向排序时)
优点
效率高,平均复杂度为 O(n log n)。
易于理解和实现。
适合大型数据集的排序。
缺点
最坏情况下效率较低。
不稳定(不会保持相等元素的原始顺序)。
**C++ 快速排序****简介**快速排序是一种高效的排序算法,以其速度和简单性而著称。它是基于分治策略,将数组划分为较小的子数组,并递归地对它们进行排序。**步骤****1. 选择枢轴*** 选择数组中的一个元素作为枢轴。 * 理想情况下,枢轴应该位于数组中间点附近。**2. 分区*** 将数组分成两个子数组:* 左子数组包含小于或等于枢轴的所有元素。* 右子数组包含大于枢轴的所有元素。**3. 递归*** 对左子数组和右子数组递归地重复步骤 1-2,直到所有子数组排序完成。**详细说明****选择枢轴:*** 选择枢轴时,通常有三种策略:* 第一元素* 最后一元素* 中位元素(左、中、右元素的中值)**分区:*** 初始化两个指针:i 指向左子数组,j 指向右子数组。 * 循环,直到 i 和 j 相遇:* 如果 nums[i] <= pivot,则将其留在左子数组中并递增 i。* 否则,将 nums[i] 与 nums[j] 交换,并将 j 递减。**递归:*** 对 [low, i-1] 和 [j+1, high] 范围内的子数组递归地调用快速排序算法。**终止条件:*** 当子数组只有一个元素时,快速排序终止。**复杂度****平均复杂度:** O(n log n) **最坏复杂度:** O(n^2)(当数组已排序或反向排序时)**优点*** 效率高,平均复杂度为 O(n log n)。 * 易于理解和实现。 * 适合大型数据集的排序。**缺点*** 最坏情况下效率较低。 * 不稳定(不会保持相等元素的原始顺序)。