QUICK_SORT(A,p,r)
if(p<r)
then q <—— PARTITION(A,p,r)
QUICK_SORT(A,p,q-1)
QUICK_SORT(A,q+1,r)
//核心函數,對數組A[p,r]進行就地重排,将小于A[r]的數移到數組前半部分,将大于A[r]的數移到數組後半部分。
PARTITION(A,p,r)
pivot <—— A[r]
i <—— p-1
for j <—— p to r-1
do if A[j] < pivot
i <—— i+1
exchange A[i]<——>A[j]
exchange A[i+1]<——>A[r]
return i+1
程式代碼:
#include <gtest/gtest.h>
#include <algorithm>
using namespace std;
template<typename T>
int Partition(T* data, int low, int high)
{
T pivot = data[high];
int i = low - 1;
int tmp;
for (int j = low; j < high; j++)
{
if (data[j] < pivot)
{
tmp = data[++i];
data[i] = data[j];
data[j] = tmp;
}
}
tmp = data[i+1];
data[i+1] = data[high];
data[high] = tmp;
return i+1;
}
template<typename T>
void QSort(T* data, int low, int high)
{
if (low < high)
{
int mid = Partition(data, low, high);
QSort(data, low, mid - 1);
QSort(data, mid + 1, high);
}
}
// Helper function
template<typename T>
void ShowElem(T& val)
{
cout << val << " ";
}
template<typename T>
bool Validate(T* data, int low, int high)
{
for (int i=low; i < high; ++i)
{
if (data[i] > data[i+1])
{
return false;
}
}
return true;
}
TEST(Algo, tQSort)
{
int d1[] = {2,8,7,1,3,5,6,4};
QSort(d1, 0, 7);
for_each(d1, d1+8, ShowElem<int>);
ASSERT_TRUE(Validate(d1,0,7));
cout << endl;
int d2[] = {2};
QSort(d2, 0, 0);
for_each(d2, d2+1, ShowElem<int>);
ASSERT_TRUE(Validate(d2,0,0));
cout << endl;
int d3[] = {2,4,5,6,7,5,2,3,5,7,10,111,2,4,5,6,3,4,5};
QSort(d3, 0, 18);
for_each(d3, d3+19, ShowElem<int>);
ASSERT_TRUE(Validate(d3,0,18));
cout << endl;
}