C++:利用模板类进行若干排序算法

template <class T>
class CSort
{
public:
    CSort(int nArraySize);
    virtual ~CSort();

    void Bubble(T arr[]);            //冒泡排序
    void insertion(T arr[]);        //插入排序
    void Quick(T arr[], int leftlimit, int rightLimit);    //快速排序
    void Selection(T arr[]);        //选择排序

private:
    int _arrSize;
};

template <class T>
CSort<T>::CSort(int nArraySize)
{
    if (nArraySize < 0)
        _arrSize = 0;
    else
        _arrSize = nArraySize;
}

template <class T>
CSort<T>::~CSort()
{
}

template <class T>
void CSort<T>::Bubble(T arr[])
{
    T tmp;
    int last = _arrSize - 1;
    bool isSorted = true;
    do
    {
        isSorted = true;
        for (int i = 0; i < last; i++)
        {
            if (arr[i] > arr[i + 1])
            {
                tmp = arr[i];
                arr[i] = arr[i + 1];
                arr[i + 1] = tmp;
                isSorted = false;
            }
        }
        last--;
    } while (!isSorted);
}

template <class T>
void CSort<T>::insertion(T arr[])
{
    T val;
    for (int i = 1; i < _arrSize; i++)
    {
        val = arr[i];
        int n;
        for (n = i - 1; n >= 0 && val < arr[n]; n--)
        {
            arr[n + 1] = arr[n];
        }
        arr[n + 1] = val;
    }
}

template <class T>
void CSort<T>::Quick(T arr[], int lLimit, int rLimit)
{
    int left = lLimit;
    int right = rLimit;
    int pivot = (left + right) / 2;

    T tmp;
    T mid = arr[pivot];
    do
    {
        while ((arr[left] < mid) && (left < rLimit))
        {
            left++;
        }
        while ((mid < arr[right]) && (right > lLimit))
        {
            right--;
        }
        if (left <= right)
        {
            tmp = arr[left];
            arr[left] = arr[right];
            arr[right] = tmp;
            left++;
            right--;
        }
    } while (left <= right);

    if (lLimit < right)
    {
        CSort<T>::Quick(arr, lLimit, right);
    }
    if (left < rLimit)
    {
        CSort<T>::Quick(arr, left, rLimit);
    }
}

template <class T>
void CSort<T>::Selection(T arr[])
{
    T tmp;
    int min;
    for (int i = 0; i < _arrSize - 1; i++)
    {
        min = i;
        for (int n = i + 1; n < _arrSize; n++)
        {
            if (arr[n] < arr[min])
            {
                min = n;
            }
        }
        tmp = arr[min];            //交换位置
        arr[min] = arr[i];
        arr[i] = tmp;
    }
}

int main()
{
    CSort<int> _sort(11);
    int arr[] = { 24, 19, 13, 90, -35, 23, 46, -5, 128, 69, 0 };
    _sort.Selection(arr);
    for (int i = 0; i < sizeof arr / sizeof arr[0]; i++)
    {
        cout << arr[i] << "\t";
    }
    cout << endl;

    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

宏笋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值