基本思想:
快速排序是一种常用的排序算法,其基本思想是通过分治法将一个待排序的序列分成两个子序列,其中一个子序列的所有元素都比另一个子序列的所有元素小。然后,递归地对两个子序列进行排序,最后通过合并两个有序序列得到一个完全有序的序列。
具体来说,快速排序的步骤如下:
1. 选择一个基准元素(通常选择序列的第一个元素或最后一个元素或中间元素)。
2. 将序列划分成两个子序列,小于等于基准元素的元素放在左边,大于基准元素的元素放在右边。这个过程称为划分操作。
3. 对左右两个子序列分别递归地应用快速排序,直到子序列的长度为1或者为空,即无法再分割时停止递归。
4. 最后,将经过排序的子序列进行合并,得到最终有序的序列。
在划分操作中,常用的方法是使用双指针法。首先,选择基准元素,通常是序列的第一个或最后一个或中间元素。然后,设置一个左指针指向序列的起始位置,一个右指针指向序列的末尾位置。然后,从右指针开始,向左移动,找到一个小于基准元素的元素。再从左指针开始,向右移动,找到一个大于基准元素的元素。交换这两个元素的位置,重复这个过程,直到左指针超过或等于右指针。最后,将基准元素与左指针所指向的元素进行交换,这样就完成了一次划分操作。
通过不断地划分和递归排序,快速排序会将一个待排序序列分解成越来越小的子序列,直到每个子序列都只包含一个元素或为空。然后通过合并这些有序的子序列,得到最终的完全有序序列。
效率分析:
在快速排序中,记录的比较和交换是从两端向中间进行的,关键字较大的记录一次就能交换到后面单元,关键字较小的记录一次就能交换到前面单元, 记录每次移动的距离较大,因而总的比较和移动次数较少。
最坏时间复杂度:O(n2) 平均时间复杂度:O(nlogn) 辅助空间:O(n)或O(logn)
核心代码:
void quick_sort(int q[], int l, int r)
{
if (l >= r) return;
int i = l - 1, j = r + 1, x = q[(l + r )/2];
while (i < j)
{
do i ++ ; while (q[i] < x);
do j -- ; while (q[j] > x);
if (i < j) swap(q[i], q[j]);
}
quick_sort(q, l, j), quick_sort(q, j + 1, r);
}
本文详细介绍了快速排序算法,包括其基本思想(分治法),步骤(选择基准、划分、递归、合并),以及效率分析(平均O(nlogn),最坏O(n^2),辅助空间)。并给出了核心代码示例。
1657

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



