常用算法

1. 快速排序

#include <iostream>
#include <vector>
using namespace std;
 int partition(vector<int> &nums, int low,int high)
 {
    int key=nums[low]; 
    while(low<high)
    {
    while(low<high && nums[high]>=key) high--;  // 1  升序
    nums[low]=nums[high];
    swap(nums[low],nums[high]);
    while(low<high && nums[low]<=key) low++;  //2  改变1,2两处符号为nums[high]<=key,nums[low]>=key可以实现降序
    nums[high]=nums[low];
        swap(nums[low],nums[high]);
    }
    nums[low]=key;
    return low;
 }

 void quickSort(vector<int> &nums, int begin, int end)
 {
    if(begin<end){  //此处if易忘,漏写会导致不能跳出递归
    int pos=partition(nums,begin,end);
    quickSort(nums,begin,pos-1);
    quickSort(nums,pos+1,end);
    }

 }


 int main()
 {
 int a[]={12,32,1,4,213,45,2,4,6};
 vector<int> nums;

 for(int i=0;i<sizeof(a)/sizeof(int);i++)
    nums.push_back(a[i]);

 quickSort(nums,0,sizeof(a)/sizeof(int)-1);

 for(int i=0;i<nums.size();i++)
    cout<<nums[i]<<" ";
    cout<<endl;

    return 0;
 }

2. STL heap
对vector进行堆操作:

#include <iostream>
#include <vector>
bool cmp(int a,int b)
{
    return a>b;
}
int main(){
int a[]={8,9,7,4,5,6,3,2,1};

    vector<int >v;
    for(int i=0;i<sizeof(a)/sizeof(int);i++)
    v.push_back(a[i]);

    //函数原型make_heap(iter1,iter2,cmp),cmp可以调整成小顶堆
    make_heap(v.begin(),v.end()); //将v转换成大顶堆


    1.添加元素:先push到vector结尾,后使用push_heap(it1,it2)调整
    v.push_back(10);
    push_heap(v.begin(),v.end());

    2.删除元素 pop_heap()会将堆顶元素放到vector最后,然后v.pop_back() 移除
    pop_heap(v.begin(),v.end());
    v.pop_back();

    3.堆排序sort_heap(it1,it2,cmp) 同样默认降序,cmp可调整成升序
    前提:必须在已经是堆的情况下调用该排序


}

3.自己实现string类

#include <iostream>
#include <memory>
#include <cstring>
using namespace std;
 class mystring{
    private:
    char *m_data;
    public:
    mystring();
    mystring(const char* ptr);
    mystring(const mystring&s);
    ~mystring();
    mystring& operator =(const mystring& s);
    friend ostream& operator<< (ostream& out,const mystring &s);

 };
 mystring::mystring(){  //默认构造函数 
    m_data=new char[1];
    *m_data='\0';
 }
 mystring::mystring(const char* ptr)  //*ptr初始化 
 {
    if(ptr==NULL)
    {
    m_data=new char[1];
    *m_data='\0';
     }
     else{
        int len=strlen(ptr);
        m_data=new char[len+1];
        strcpy(m_data,ptr);
    }
 }

 mystring::mystring(const mystring& s)  //拷贝构造函数 
 {
    int len=strlen(s.m_data);
    m_data=new char[len+1];
    strcpy(m_data,s.m_data);
 }

 mystring& mystring::operator=(const mystring&s)  //重载= 
 {
    if(this != &s)
    {
        delete [] m_data;
        int len=strlen(s.m_data);
        m_data=new char[len+1];
        strcpy(m_data,s.m_data);
     }
     return *this;
 }

    ostream& operator<< (ostream& out,const mystring &s)
    {
        out<<s.m_data;
        return out;
     }
 mystring::~mystring()
 {
    delete[] m_data;
 }

 int main()
 {
    mystring s="hello";
    mystring s1=s;

    cout<<s<<endl;
    cout<<s1<<endl;
 }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值