1.冒泡排序
代码:
void Sort(int* arr,int nLength) { int i; int k; for(i=0;i<nLength-1;i++) { for(k=0;k<nLength-1-i;k++) { if(arr[k]>arr[k+1]) { int temp = arr[k]; arr[k] = arr[k+1]; arr[k+1] = temp; } } } }
最简单的排序,不多做说明;
有个缺点:
需要排序的可能还有其它类型,比如double、float、short、结构、类等,不限于int;
这样导致需要给每一种类型都写一个相同的排序方法;
2.折半查找
代码:
int Find(int* arr,int nLength,int nElement) { int nBegin = 0,nEnd = nLength-1,nIndex; while(nBegin<=nEnd) { nIndex = (nBegin+nEnd)/2;//(nBegin+nEnd)>>1 if(nElement > arr[nIndex]) { nBegin = nIndex+1; } else if(nElement < arr[nIndex]) { nEnd = nIndex-1; } else { return nIndex; } } return -1; }
查找就是从一堆数据中找到自己需要的数据;
查找有两类:
顺序查找 ->从头开始一个个找,适合于没排序时查找;
例如:从一个数组{1,5,3,7,9}中找3的下标;从第一个数开始往后找,找到3后返回3的下标即可;
折半查找 ->前提条件是排好序,每次查找砍掉一半,可以提高查找效率;
例如: 从数组{1,3,5,7,9,11,13}中找出3的下标;
用数组长度/2得到下标;7/2=3;
找到下标处的数与目标数比较;第3个数是5,5>3说明3在5前面,于是5和它后面的部分不再考虑;依次类推找到目标数;
3.模板
例如:上面的冒泡排序和折半查找只能适用于int型;
如果想适应于多种类型,可以使用模板;
模板的本质就是代码的复制;
编译时编译器将会模板替换成对应的类型;
使用模板和不使用模板的反汇编完全一样;
可以利用模板来实现链表结构;
函数中的类型不确定时可以用模板
例如:用模板修改后的冒泡排序和折半查找
template<class T> void Sort(T arr,int nLength) { int i; int k; for(i=0;i<nLength-1;i++) { for(k=0;k<nLength-1-i;k++) { if(arr[k]>arr[k+1]) { int temp = arr[k]; arr[k] = arr[k+1]; arr[k+1] = temp; } } } } template<class T> void Print(T arr,int nLength) { int i; for(i=0;i<nLength;i++) { printf("%d\n",arr[i]); } } template<class T,class E> int Find(T arr,int nLength,E nElement) { int nBegin = 0,nEnd = nLength-1,nIndex; while(nBegin<=nEnd) { nIndex = (nBegin+nEnd)/2;//(nBegin+nEnd)>>1 if(nElement > arr[nIndex]) { nBegin = nIndex+1; } else if(nElement < arr[nIndex]) { nEnd = nIndex-1; } else { return nIndex; } } return -1; } int main(int argc, char* argv[]) { char arr[] = {2,6,1,8,4,3}; Sort(arr,6); Print(arr,6); printf("---------------\n"); int x = Find(arr,6,1); printf("%x\n",x); return 0; }
也可以在结构体和类中使用模板:结构体中的类型不确定时可以用模板
template<class T,class M> struct Base { T x; T y; M a; M b; T Max() { if(x>y) { return x; } else { return y; } } M Min() { if(a<b) { return a; } else { return b; } } }; int main(int argc, char* argv[]) { Base<int,char> base; base.x = 10; base.y = 20; base.a = 1; base.b = 2; int x = base.Max(); int y = base.Min(); printf("%d %d\n",x,y); return 0; }