数据结构与算法之快速排序

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() 封装了快速排序算法,并且通过内插对快速排序的最坏情况进行了改进。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值