快速排序(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;
}
输出结果:
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
好了,这篇先到这里。
同志,加油!!!
简单概括,快速排序是每次选择一个主元(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;
}
输出结果:
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
好了,这篇先到这里。
同志,加油!!!
相关文章推荐
- 快速排序(Quick Sort)的C语言实现
- 基础排序算法 – 快速排序Quick sort
- 排序:快速排序Quick Sort
- 快速排序的PHP实现 Quick Sort
- 排序---交换排序---快速排序Quick Sort
- 【内部排序】五:快速排序(Quick Sort)详解与代码
- 快速排序Quick sort
- 快速排序 quick sort
- 快速排序源码(quick sort)
- 桶排序、冒泡排序、快速排序 -- 算法学习 小结篇
- JAVA排序算法实现代码-快速(Quick Sort)排序
- [算法] 快速排序 Quick Sort
- 快速排序 Quick Sort在软考中考查的知识点,转发自NUS
- 快速排序 -- 算法小结
- 快速排序 quick sort
- 快速排序 知识点小结
- 快速排序Quick sort
- 快速排序(Quick sort)值得一提的三个变种算法
- 快速排序(Quick Sort) Java实现
- 快速排序 Quick Sort