您的位置:首页 > 产品设计 > UI/UE

快速排序(Quick Sort)小结

2017-05-20 17:02 232 查看
什么是快速排序?

       简单概括,快速排序是每次选择一个主元(pivot element),以主元为参考,将序列分成两拨(一拨大于,一拨小于等于),并将主元放置到其正确的位置上,这就是快速排序。

优点:

       (1)虽然最坏情况时间复杂度不算好,但通常却是实际情况中最好的选择,主要原因是:平均性能好,且常数因子小;

       (2)原址排序

效率:(该算法效率依赖于每次选择的主元是否对序列进行了均衡的划分,因为该算法与归并排序类似,利用了分治思想

       (1)如果划分平衡(哪怕99:1也不要紧),效率与归并排序一样:



       (2)如果遇到最坏情况,每次都分得一个0数组,此时,快速排序的效率下降到与插入排序差不多,为:



快速排序的随机化版本:

       随机化版本,不用让每次输入的数组都是原数组的一个随机序列,因为决定快速排序的随机性的根本在于主元选择的随机性;在随机化版本中将随机选择数组中的一个元素作为主元,这样来实现随机化。

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------

伪代码:

//功能:对数组A中的下标范围为p到r的子数组进行快速排序
QUICKSORT(A, p, r)
1 if p < r
2 q = PARTITION(A, p, r)
3 QUICKSORT(A, p, q - 1)
4 QUICKSORT(A, q + 1, r)

//功能:将数组A中下标为p到r的子数组进行划分,返回划分点下标
PARTITION(A, p, r)
1 x = A[r] //主元
2 i = p - 1
3 for j = p to r - 1
4 if A[j] <= x
5 i += 1
6 exchange A[i] with A[j]
7 exchange A[i+1] with A[r]
8 return i + 1C++代码实现:
#include <iostream>
#include <vector>

using namespace std;

int partition(vector<int> &A, int p, int r)
{
int x = A.at(r);
int i = p - 1;
for(int j = p ; j < r ; ++j)
{
if(A.at(j) <= x)
{
i += 1;
int tmp = A.at(i);
A.at(i) = A.at(j);
A.at(j) = tmp;
}
}
int tmp = A.at(i+1);
A.at(i+1) = A.at(r);
A.at(r) = tmp;
return i+1;
}

void quickSort(vector<int> &A, int p, int r)
{
if(p < r)
{
int q = partition(A, p, r);
quickSort(A, p, q - 1);
quickSort(A, q + 1, r);
}
}

int main()
{
vector<int> A = {2, 8, 7, 1, 3, 5, 6, 4};
cout << "Initial array: ";
for(int i = 0 ; i < (int)A.size() ; ++i)
{
cout << A.at(i) << ", ";
}
cout << endl;

quickSort(A, 0, (int)A.size()-1);

cout << "Sorted array: ";
for(int i = 0 ; i < (int)A.size() ; ++i)
{
cout << A.at(i) << ", ";
}
cout << endl;

return 0;
}
输出结果:



-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------

好了,这篇先到这里。

同志,加油!!!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息