算法思想:通过递归将待排序元素分为小于主元元素和大于主元元素两部分。元素都满足主元前的所有元素小于(大于)主元后的元素。
算法特征:期望时间复杂度O(nlgn),最坏情况时间复杂度为O(n^2)(子问题划分为n-1个元素和0个元素)
代码如下:
#include <iostream>
#include <vector>
using namespace std;
int Partition(vector<int> &A, int p, int r)
{
int temp;
int x = A[r];
//此处i总是小于正常索引一个单位,即索引比i大1
int i = p - 1;
for(int j = p; j <= r - 1; j ++)
{
if(A[j] <= x)
{
i += 1;
temp = A[i];
A[i] = A[j];
A[j] = temp;
}
}
temp = A[i + 1];
A[i + 1] = A[r];
A[r] = temp;
return i + 1;
}
//算法导论
void QuickSort(vector<int> &A, int p, int r)
{
//int q;
if(p < r)
{
int q = Partition(A, p, r);
QuickSort(A, p, q - 1);
QuickSort(A, q + 1, r);
}
}
int PartitionT(vector<int> &A, int p, int r)
{
int temp = A[p];
int i = p, j = r;
while(i != j)
{
while(i < j && A[j] >= temp)
j --;
if(i < j)
{
A[i] = A[j];
i ++;
}
while(i < j && A[i] <= temp)
i ++;
if(i < j)
{
A[j] = A[i];
j --;
}
}
A[i] = temp;
return i;
}
//天勤数据结构
void QuickSortT(vector<int> &A, int p, int r)
{
if(p < r)
{
int q = PartitionT(A, p, r);
QuickSortT(A, p, q - 1);
QuickSortT(A, q + 1, r);
}
}
int main()
{
vector<int> A{2, 8, 7, 1, 3, 5, 6, 4};
vector<int> B{2, 8, 7, 1, 3, 5, 6, 4};
cout << "算法导论:" << endl;
QuickSort(A, 0, A.size() - 1);
for(vector<int>::iterator it = A.begin(); it != A.end(); it ++)
{
cout << *it << ' ';
}
cout << endl;
cout << "天勤数据结构:" << endl;
QuickSort(B, 0, A.size() - 1);
for(vector<int>::iterator it = B.begin(); it != B.end(); it ++)
{
cout << *it << ' ';
}
cout << endl;
return 0;
}