C++泛型编程 快速排序的函数模板实现

本文介绍了使用C++函数模板实现快速排序的方法,包括基本思想、实现步骤和代码展示。快排通过选取基准、元素整理和递归处理来完成排序,代码简洁,适用于已了解快排原理的读者。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

说在前面的废话

话说快一年没写过博客了。。。
在建站之前就先用csdn写吧

这次要说的东西也没有啥,主要是想写一次快排(学了这么就快排都没写过你敢信

用法类似于stl里面的sort,有两个版本。

不知道为什么写了很长时间。。。这么短的代码
还是感觉数组版的好写一点

学过快排的同学可以不用看下面这段了

快排的基本思想

1.选取一个基准
2.将比它”小”的放在它前面,比他“大”的放在后面(广义的小和大)
3.递归处理前面那一段和后面那一段

实现步骤

函数传入的是指向第一个元素的迭代器( begin )和指向最后一个元素后一个的迭代器( end )
还可以传入一个比较函数( comp )

考虑快排的操作:

1.选定一个基准

我们选择第一个元素的值作为排序的基准,把它的迭代器记作 temp
然后记录一前一后两个迭代器,记作front和back。

2.整理

每一轮,我们用back迭代器从后向前遍历,直到当前元素的值小于temp指向元素的值,然后交换他们的值,并让temp指向现在的位置再使back向前移动一次;随后对front迭代器进行类似的操作。

持续进行上面的操作,直到front和back间没有元素,即所有元素都被遍历过。

3.递归处理

temp所在的元素已经是其应该在的位置,所以只需要处理begin~temp 和 temp+1~end这两个区间的

代码

#include <iostream>
#include <vector>

using namespace std;

template <typename _T>
void _swap(_T& _a, _T& _b)
{
    _T temp = _b;
    _b = _a;
    _a = temp;
}

template <typename _Random_Access_Iterator>
void my_quick_sort(_Random_Access_Iterator _begin, _Random_Access_Iterator _end)
{
    if (_end - _begin <= 1)
        return;

    _Random_Access_Iterator _temp = _begin;
    _Random_Access_Iterator _front = _begin;
    _Random_Access_Iterator _back = _end - 1;

    while (true)
    {
        while (_back - _front >= 0)
        {
            if (*_back < *_temp)
            {
                _swap(*_back, *_temp);
                _temp = _back;
                _back--;
                break;
            }
            _back--;
        }

        while (_back - _front >= 0)
        {
            if (*_temp < *_front)
            {
                _swap(*_temp, *_front);
                _temp = _front;
                _front++;
                break;
            }
            _front++;
        }

        if (_back - _front < 0)
            break;
    }

    my_quick_sort(_begin, _temp);
    my_quick_sort(_temp + 1, _end);
}

template <typename _Random_Access_Iterator, typename _Compare>
void my_quick_sort(_Random_Access_Iterator _begin, _Random_Access_Iterator _end, _Compare _comp)
{
    if (_end - _begin <= 1)
        return;

    _Random_Access_Iterator _temp = _begin;
    _Random_Access_Iterator _front = _begin;
    _Random_Access_Iterator _back = _end - 1;

    while (true)
    {
        while (_back - _front >= 0)
        {
            if (_comp(*_back, *_temp))
            {
                _swap(*_back, *_temp);
                _temp = _back;
                _back--;
                break;
            }
            _back--;
        }

        while (_back - _front >= 0)
        {
            if (_comp(*_temp, *_front))
            {
                _swap(*_temp, *_front);
                _temp = _front;
                _front++;
                break;
            }
            _front++;
        }

        if (_back - _front < 0)
            break;
    }

    my_quick_sort(_begin, _temp, _comp);
    my_quick_sort(_temp + 1, _end, _comp);
}

template<typename _T>
bool compare(const _T& a, const _T& b)
{
    return a > b;
}

int main(int argc, char** argv)
{
    vector<int> a={95,1,4,2,6,9,3,6562,324,54,32243,123,43,657457,100,43};

    my_quick_sort(a.begin (), a.end (), compare<int>);

    for (auto i : a)
    {
        cout << i << endl;
    }

    size_t t;


    cin >> a[1];

    return 0;
}
这代码有那些控件:using System; using System.Security.Cryptography; using System.Text; using System.Windows.Forms; namespace RSASignatureVerification { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void btnSign_Click(object sender, EventArgs e) { try { // 生成RSA密钥对 RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(); string privateKey = rsa.ToXmlString(true); string publicKey = rsa.ToXmlString(false); // 使用私钥对消息进行签名 byte[] data = Encoding.UTF8.GetBytes(txtMessage.Text); byte[] signature = SignData(data, privateKey); // 显示签名结果 txtSignature.Text = Convert.ToBase64String(signature); // 将私钥和公钥保存到文件中 SaveKeyToFile(privateKey, "privateKey.txt"); SaveKeyToFile(publicKey, "publicKey.txt"); } catch (Exception ex) { MessageBox.Show(ex.Message); } } private void btnVerify_Click(object sender, EventArgs e) { try { // 从文件中读取公钥 string publicKey = LoadKeyFromFile("publicKey.txt"); // 使用公钥对签名进行验证 byte[] data = Encoding.UTF8.GetBytes(txtMessage.Text); byte[] signature = Convert.FromBase64String(txtSignature.Text); bool result = VerifyData(data, signature, publicKey); // 显示验证结果 if (result) { MessageBox.Show("签名验证成功"); } else { MessageBox.Show("签名验证失败"); } } catch (Exception ex) { MessageBox.Show(ex.Message); } } // 使用私钥对数据进行签名 private byte[] SignData(byte[] data, string privateKey) { RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(); rsa.FromXmlString(privateKey); return rsa.SignData(data, new SHA256CryptoServiceProvider()); } // 使用公钥对签名进行验证 private bool VerifyData(byte[] data, byte[] signature, string publicKey) { RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(); rsa.FromXmlString(publicKey); return rsa.VerifyData(data, new SHA256CryptoServiceProvider(), signature); } // 将密钥保存到文件中 private void SaveKeyToFile(string key, string fileName) { using (System.IO.StreamWriter sw = new System.IO.StreamWriter(fileName)) { sw.Write(key); } } // 从文件中读取密钥 private string LoadKeyFromFile(string fileName) { using (System.IO.StreamReader sr = new System.IO.StreamReader(fileName)) { return sr.ReadToEnd(); } } } }
06-11
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值