编程艺术系列学习笔记

1.字符数组的动态分配

mallo/free

char *p=(char *)malloc(sizeof(char)*k);//强制类型转换

free(p);  //有括号

new/delete

char *p=new char[k];

delete []p;

2.字符串的循环左/右移动(字符串长N,右移k)

(1) 最直观,以空间换取时间,时间:O(N),空间:O(k)

(2) 逆置逆置再逆置,复杂度为:O(N),与k无关

divide-and-conquer

3.模版函数

每个使用模版的函数都需要模版表示

template<class T>

void funA(T){}

template<class T> //这个不能省略

void funB(T){}

4.快速排序

(1)divide,<,pivot,> 该部分需要N

(2)conquer, 每个组再Quicksort

(3)combine, do nothing

时间复杂度:O(NlogN)

5.既然看到快速排序,就顺便把快排温习下

July的快排代码非常清晰,参考之~,以下代码测试正确

template<class T>
int quickPartition(T *p,int low,int high)
{
T key=p[low]; //first one as key
int i=low,j=high;
while(i<j)
{
while(i<j&&p[j]>key)
j--;
p[i]=p[j];
while(i<j&&p[i]<=key)
i++;
p[j]=p[i];
}
p[i]=key;  //easy to forget
return i;
}

template<class T>
void quickSort(T *p,int low,int high)
{
if (low<high)
{
int k=quickPartition(p,low,high);//divide
quickSort(p,low,k-1);//conquer
quickSort(p,k+1,high);
}
}

posted @ 2013-08-22 15:34  maglthu  阅读(130)  评论(0)    收藏  举报