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;
}