1. 快速排序的代码实现如下:
#include <iostream>
using namespace std;
template <typename T>
void sort(T* data, size_t head, size_t tail);
template<typename T>
size_t partition(T* data, size_t head, size_t tail);
template <typename T>
void mySwap(T& data1, T& data2);
static size_t count = 0;
int main (int argc, char *argv[])
{
double data[] = {1.2, 43, 9, 7.5, 3.333, 6, 5.9, 9, 6, 7.5};
for(size_t i = 0; i < 10; i++)
cout<<data[i]<<" ";
cout<<endl;
sort(data, 0, 9);
for(size_t i = 0; i < 10; i++)
cout<<data[i]<<" ";
cout<<endl;
cout<<count<<endl;
return 0;
}
template <typename T>
void sort(T* data, size_t head, size_t tail)
{
if(tail - head < 0)
throw string("Input index error!");
else if(tail - head == 0)
return;
else if(tail - head == 1)
{
if(data[head] > data[tail])
mySwap(data[head], data[tail]);
}
else if(tail - head > 1)
{
size_t index = partition(data, head, tail);
sort(data, head, index);
sort(data, index + 1, tail);
}
}
template <typename T>
size_t partition(T* data, size_t head, size_t tail)
{
T flag = data[head + (tail - head)/2];
while(head <= tail)
{
if(data[head] >= flag && data[tail] <= flag)
{
mySwap(data[head], data[tail]);
}
if(data[head] <= flag)
head ++;
if(data[tail] >= flag)
tail --;
}
return tail;
}
template <typename T>
void mySwap(T& data1, T& data2)
{
count ++;
T tmp = data1;
data1 = data2;
data2 = tmp;
}
2. 快速排序的改进:
(1)随机生成或三数取中获取flag数;
(2)当拆分的数组减小到一定程度时使用插入排序。
3. STL中快速排序的相关封装:
STL中的排序算法可以用仿函数来自定义比较函数,也可以在自定义数据类型中重载<操作符。
sort() 封装了快速排序算法,并且通过内插对快速排序的最坏情况进行了改进。