最佳答案快速排序算法与实现 什么是stable_sort stable_sort是STL中的一个排序函数,它的主要特点是排序结果可以保持元素相对位置不变。 也就是说,如果比较两个元素相等,在排序后,排序后...
快速排序算法与实现
什么是stable_sort
stable_sort是STL中的一个排序函数,它的主要特点是排序结果可以保持元素相对位置不变。 也就是说,如果比较两个元素相等,在排序后,排序后的两个元素的相对位置和排序前的相对位置是相同的。
它的时间复杂度是O(N*logN),也就是说,用stable_sort进行排序的时间复杂度跟快速排序算法是一样的。
快速排序算法的原理
快速排序算法是一种分而治之的算法,其基本思想是通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的记录关键字小,然后再分别对这两部分记录继续进行排序,以达到最终排序的效果。
具体过程如下:
1.从数列中挑出一个元素,称为\"基准\"(pivot)。
2.重新排序数列,所有比基准值小的元素摆放在基准前面,所有比基准值大的元素摆在基准后面。
3.递归地把小于基准值的子数列和大于基准值的子数列排序。
快速排序算法的实现
快速排序算法的实现可以参考下面的C++代码:
```cpp void qsort(int l, int r, int a[]) { //l, r为区间左右端点,a为待排序数组 if (l >= r) return; //递归出口 int i = l, j = r, mid = a[(l + r) >> 1]; //取中间元素为基准 while (i <= j) { //开始分隔 while (a[i] < mid) i++; while (a[j] > mid) j--; if (i <= j) { swap(a[i], a[j]); i++; j--; } } qsort(l, j, a); //递归排序左子序列 qsort(i, r, a); //递归排序右子序列 } ```上述代码是递归实现的,我们可以通过栈来改写成非递归实现,这样可以节省递归调用的栈空间。
快速排序算法的实现过程中,有两点需要注意:
1.选取基准元素的方法
基准元素应该是随机选择的,这样可以降低最坏情况(时间复杂度为O(N^2))出现的几率。
2.分隔过程中相等元素的处理
快速排序算法在分隔过程中,如果遇到两个相等的元素,它们可能会在分隔后交换位置,导致稳定性被破坏。
为了保持稳定性,我们可以在分隔过程中将相等元素放在一组,然后将这组元素按照它们在原序列中的相对位置进行插入排序,并且要注意插入排序不会改变彼此之间的顺序。
总结
快速排序算法是一种高效的排序算法,它的时间复杂度为O(N*logN)。
但是,它的最坏情况(时间复杂度为O(N^2))出现的概率很大,并且它是一种不稳定的排序算法。
当我们需要保持元素相对位置不变的时候,我们可以使用STL中的stable_sort函数来进行排序。
下一篇返回列表